2008-09-15 35 views
5

Standart LinqToSql sorgu sözdizimini kullanan herhangi bir sayıda rastgele anahtar kelime için herhangi bir tam metin araması (FREETEXT() CONTAINS()) gerçekleştirmenin iyi bir yolu var mı?LinqToSql ve tam metin araması - bu yapılabilir mi?

Bir Kayıtlı Proc kullanmak zorunda kalmamak veya Dinamik SQL çağrıları oluşturmak zorunda kalmak isterim.

Açıkçası ben sadece FREETEXT() kullanan veya) (İÇEREN bir SPROC bir parametre üzerinde de arama dizesini pompalamak olabilir, ama arama ile daha yaratıcı olmak ve benzeri sorguları oluşturmak için umuyordum:

"biberli pizza" ve hamburger, "elmalı turta" değil.

Çılgın Biliyorum - ama bunu doğrudan LinqToSql'den yapabilmek düzgün olmaz mıydı? Bunun nasıl gerçekleştirileceğine dair herhangi bir ipucu çok takdir edilecektir.

Güncelleme: Ben ... şey here üzerine de

olabilir düşünüyorum: aslında ben ne sorduğunu anlamını değiştirdi çünkü benim soru başlığına yapılan değişikliği geri alındı. I 'un tam metin aramasının LinqToSql'de desteklenmediğini biliyorum - bunu bilmek isteyip istemediğimi sordum. Bunun yerine - düzenleme-mutlu-tetik-parmaklı kitleleri yatıştırmak için başlığımı güncelledim.

cevap

4

Ne yazık ki LINQ to SQL tam metin aramayı desteklemiyor.

Orada olabileceğini düşündüğüm bir sürü ürün var: Lucene.NET, NHibernate Search akla geliyor. NHibernate Search ile birleştirilen NHibernate için LINQ muhtemelen bu işlevselliği verir, ancak her ikisi de hala betada derindir.

İşte
string q = query.Query; 
IQueryable<Story> stories = ActiveStories 
         .Join(tvf_SearchStories(q), o => o.StoryId, i => i.StoryId, (o,i) => o) 
         .Where (s => (query.CategoryIds.Contains(s.CategoryId)) && 
            /* time frame filter */ 
           (s.PostedOn >= (query.Start ?? SqlDateTime.MinValue.Value)) && 
           (s.PostedOn <= (query.End ?? SqlDateTime.MaxValue.Value))); 

'tvf_SearchStories:

+0

Hey Jon, bunun için teşekkürler. Cevabınızdan prensipte mutluyum ve başka bir soyutlama katmanı ekleyebileceğimin farkındayım. İdeal değil - CONTAINS() SPROC'u yazabilir ve her zaman için Linq kullanabilir. Sorum şu: "Linq kullanılarak yapılabilir mi?" Değilse, cevabınız yeterli olacaktır. – RobertTheGrey

+0

Şimdi bunun için Lucene.NET kullanmaya karar verdim ve gerçekten çok iyi çalışıyor. Şimdi sadece Memcached çalıştırmak gerekiyor ve DB ;-) vurmak için neredeyse ihtiyacım var – RobertTheGrey

5

Ben, tam metin arama bileşeni kapsüllemek için bir tablo değerli işlev kullanarak toparlamaya yönetmek ettik sonra gecikmeli yürütme faydalarını muhafaza benim LINQ ifadesi içinde bunu başvurulan 'dahili olarak tam metin araması kullanan tablo değerli fonksiyonudur

İlgili konular