none
Full Text Search ContainsTable olayı kullandığım Stored Prosedure ü projeme entityframework ile aktaramıyorum. RRS feed

  • Soru

  • Arkadaşlar SQL de yazdığım bu stored prosedure ü MVC projeme aktaramıyorum.

    Prosedure yükleniyor fakat result değeri int olarak.

    Didik didik ettim.

    Problemin Full Text Search Contains Table olayında sorgulanacak sorgu cümlesinden kaynaklandığını buldum.

    Şöyleki gelen @Title değerini boşluk ile split edip bir tabloya aktarıyorum.

    Sonra @SearchQuery nvarchar(500) değerine tablodaki değerleri aralarında "AND" olacak şekilde atıyorum.

    Şöyleki;

    @Title = "bu bir deneme" ise gelen @Title değeri

    @SearchQuery = '"*bu*" AND "*bir*" AND "*deneme*"'

    şekline getiriyorum ve ContainsTable da kullanıyorum.

    Ama tabi kullanamıyorum :)

    Execute Stored Prosedure ile kontro lettiğimde hata almıyorum.

    Ama entityframework ile MVC projeme aktarırken result int olarak ekkiyor.

    Tek tek satır satır denedim.

    Sorunun ContainsTable da @SearchQuery değerini kullandığım için hatalı yüklüyor.

    Nasıl çözebileceğim konusunda yardımlarınızı bekliyorum.

    Teşekkürler.

    27 Kasım 2016 Pazar 22:39

Yanıtlar

  • Bu şekilde kullanıyorum şu anda hiç bir sorun yok 

    declare @seacrhQuery nvarchar(500);
    Set @seacrhQuery=LTRIM(RTRIM(@Text));
    declare @FixedName nvarchar(500);
    set @FixedName = LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(@seacrhQuery,' ','><'),'<>',''),'><',' ')));
    declare @Search nvarchar(500) = '';
    select @Search += ((LTRIM(RTRIM(part))+' and ')) from [dbo].SplitString(@FixedName,' ')
    set @Search = LEFT(LTRIM(RTRIM(@Search)), LEN(LTRIM(RTRIM(@Search)))-4);

    set @Search = 'NEAR('+REPLACE(@Search, ' and ', ',')+')';
    select @Search

    select P.ID, PC.Title, SUC.Url, 'Type' = 'News' from [Modules.News.Contents] as PC
    LEFT JOIN [Modules.News] as P ON P.ID = PC.PageID
    LEFT JOIN dbo.[System.UrlSeo] AS SU ON SU.ContentID = P.ID and SU.Controller = 'News' and SU.Action = 'Detail' and (SU.IsSystemDelete = 0 OR SU.IsSystemDelete IS NULL)
    LEFT JOIN dbo.[System.UrlSeo.Contents] AS SUC ON SUC.UrlID = SU.ID and SUC.LanguageID = @LanguageID
    where (PC.LanguageID = @LanguageID)
    and @IsActive_news = 1
    and freetext(PC.Title, @Search)

    30 Mayıs 2017 Salı 21:20

Tüm Yanıtlar

  • Manuel olarak yazıyorum entityframework ile projeye alıyorum. Hata vermiyor.

    Fakat @SearchQuery i yazınca projeye aldığımda hatalı yüklüyor.

    Nerede yanlış yapıyorum.

    28 Kasım 2016 Pazartesi 08:07
  • EXECUTE edilmiş bir ekran çıktısı vermen mümkünmü ?
    28 Kasım 2016 Pazartesi 10:08
  • Bu @Title null iken gelen tüm kayıtlar

    Buda @Title da eri varken

    (Gerçi @Title null ve Len e göre if ile ayrıştırıyorum. )

    28 Kasım 2016 Pazartesi 11:34
  • Bu olaydan hiç bir şey anlamadım gitti.

    Deneye deneye bir hal oldum.

    Sonuç olarak @SearchQuery değeri örneğin bunu dönüyor. > "saha*" AND "gücü*"

    Execute Stored Prosedure de test ettiğimde.

    Bunu elle yazıyorum.

    Şu şekilde

    inner Join CONTAINSTable([Modules.Pages.Contents], [Title], '"saha*" AND "gücü*"') as FTS on X.ID = FTS.[key]

    O zaman prosedure sorunsuz entity ile yükleniyor projeye.

    Ama gel gelelim @SearchQuery i yazınca proje yüklenmiyor.

    Veritipindendir dedim.

    Parametre olarak gelen @Title a varana kadar her değeri nvarchar olarak denedim.

    Hatta bir de varchar olarak denedim.

    Ama yok sıkıntıyı çözemedim.

    Veritipi karakter sayısından mı kaynaklanıyor acaba.

    nvarchar 500 yapıyorum.

    28 Kasım 2016 Pazartesi 20:12
  • Merhaba,

    Sorunun devam ediyor mu? Ediyorsa kod bloğundaki

    SELECT * FROM dbo.[Modules.Pages]...

    Başlamadan hemen önce @SearchQuery değişkenini doldurduktan sonra Debug amacıyla görmeyi denedin mi? Gerçekten beklediğin gibi bir değer ile mi doluyor baktın mı?

    SELECT @SerachQuery


    http://ekremonsoy.blogspot.com | http://www.ekremonsoy.com | @EkremOnsoy

    29 Aralık 2016 Perşembe 14:06
  • Sorun devam ediyor.
    Geçici olarak orayı es geçtim bugün-yarın tekrar bu olaya giricem.
    Dediğin şekilde test ettikten sonra sonucu aktarırım.

    Teşekkrüler.

    29 Aralık 2016 Perşembe 14:17
  • Test nasıl gidiyor?

    http://ekremonsoy.blogspot.com | http://www.ekremonsoy.com | @EkremOnsoy

    10 Ocak 2017 Salı 17:15
  • işler çok karışık gitti :)

    Karışıklıktan kurtuldum :)

    1-2 gün bu konuya odaklanıcam.

    sanırım prş-cuma ya kadar geri dönüş yaparım ;)

    Teşekkürler.

    10 Ocak 2017 Salı 17:48
  • Query'i sonunda Exec ile mi çalıştırıyorsunuz?

    Full Text search kullanmadım ama '*' kullanılabiliyor mu? 

    Bir de neden AND? Girilen cümlenin aralarına * ekleseniz olmuyor mu?

     '"*bu*bir*deneme*"' gibi.


    http://pgnchess.com
    http://dergikapaklari.com

    10 Ocak 2017 Salı 17:54
  • Yukardaki resmi incelersen dostum select içinde inner join CONTAINSTable var FTS ün özelliği

    Nette araştırırsan araya eklenecek AND ve daha başka 2-3 seçenek olduğunu görebilirisin.

    Şu anda kaynak gösteremeyeceğim kusura bakma. işlerim yoğum bitme noktasındayım :(
    • Düzenleyen ekined 10 Ocak 2017 Salı 18:11
    10 Ocak 2017 Salı 18:11
  • Yukardaki resmi incelersen dostum select içinde inner join CONTAINSTable var FTS ün özelliği

    Nette araştırırsan araya eklenecek AND ve daha başka 2-3 seçenek olduğunu görebilirisin.

    Şu anda kaynak gösteremeyeceğim kusura bakma. işlerim yoğum bitme noktasındayım :(

    Asıl soruma cevap vermemişsiniz. Neyse.

    Eğer Exec kullanıyorsanız Procedure'un sonuna bir tane Select cümlesi yazın. Gerçekte hangi alanlar geri dönüyorsa o alanları barındırsın. Sonra procedur'u projenize ekleyin. Daha sonra da o eklediğiniz select cümlesini silin.


    http://pgnchess.com
    http://dergikapaklari.com

    10 Ocak 2017 Salı 18:20
  • Dostum kodlar açık yukarıda :D

    no exec 

    iki tane select kodu var 
    if ile ayrılmış.
    biri eğer title null değil ve 2 karakterden büyükse çalışıyor oda FTS için ;)

    10 Ocak 2017 Salı 18:28
  • Bu şekilde kullanıyorum şu anda hiç bir sorun yok 

    declare @seacrhQuery nvarchar(500);
    Set @seacrhQuery=LTRIM(RTRIM(@Text));
    declare @FixedName nvarchar(500);
    set @FixedName = LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(@seacrhQuery,' ','><'),'<>',''),'><',' ')));
    declare @Search nvarchar(500) = '';
    select @Search += ((LTRIM(RTRIM(part))+' and ')) from [dbo].SplitString(@FixedName,' ')
    set @Search = LEFT(LTRIM(RTRIM(@Search)), LEN(LTRIM(RTRIM(@Search)))-4);

    set @Search = 'NEAR('+REPLACE(@Search, ' and ', ',')+')';
    select @Search

    select P.ID, PC.Title, SUC.Url, 'Type' = 'News' from [Modules.News.Contents] as PC
    LEFT JOIN [Modules.News] as P ON P.ID = PC.PageID
    LEFT JOIN dbo.[System.UrlSeo] AS SU ON SU.ContentID = P.ID and SU.Controller = 'News' and SU.Action = 'Detail' and (SU.IsSystemDelete = 0 OR SU.IsSystemDelete IS NULL)
    LEFT JOIN dbo.[System.UrlSeo.Contents] AS SUC ON SUC.UrlID = SU.ID and SUC.LanguageID = @LanguageID
    where (PC.LanguageID = @LanguageID)
    and @IsActive_news = 1
    and freetext(PC.Title, @Search)

    30 Mayıs 2017 Salı 21:20