2008-09-15 8 views
5

標準のLinqToSqlクエリ構文を使用して、任意の数の任意のキーワードに対して全文検索(FREETEXT() CONTAINS())を実行する良い方法がありますか?LinqToSqlと全文検索 - それはできますか?

私は明らかにStored Procを使用する必要がないか、動的SQL呼び出しを生成する必要があります。

はもちろん、私はちょうどFREETEXT()を使用していますか)(CONTAINS SPROCをパラメータにして検索文字列をポンプことができますが、私は、検索をより創造的などのクエリ構築するために期待していた。

を"ペッパーニピザ"とハンバーガー、 "アップルパイ"ではありません。

私は知っていますが、LinqToSqlからこれを直接行うことはできません。どのようにこれを達成するためのヒントをいただければ幸いです。

アップデート:私はまた

...私は何かhereに上かもしれないと思う:それは実際に私が求めていた何の意味が変更されたため、私は私の質問のタイトルに行われた変更をロールバック。 I LinqToSqlでは全文検索がサポートされていないことを知っています。代わりに、私は自分のタイトルを編集してハッピートリガー指のマスを癒すようにしました。

答えて

4

LINQ to SQLはフルテキスト検索をサポートしていません。

そこには、Lucene.NETとNHibernate Searchのような製品がたくさんあります。 NHibernateのためのLINQとNHibernate Searchはおそらくその機能を提供するでしょうが、どちらもベータ版でまだ深いです。

ここ
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

こんにちはジョン、ありがとう。私は原則としてあなたの答えに満足しており、抽象化の別のレイヤーを追加できることを認識しています。理想的ではない - CONTAINS()SPROCを書いて、他のすべてのLinqを使うかもしれません。私の質問は "それはLinqを使用して行うことができます"です?そうでない場合は、あなたの答えで十分です。 – RobertTheGrey

+0

私はこれでLucene.NETを使うことにしました。本当にうまくいきます。今私はちょうどMemcachedを実行する必要があり、私はほとんどDBを打つ必要はありません;-) – RobertTheGrey

5

私は、フルテキスト検索コンポーネントをカプセル化するために、テーブル値関数を使用することによってこの問題を回避するために管理してきましたが、その後遅延実行の利点を維持し、私のLINQの式の中でそれを参照しました'は、内部的に全文検索を使用するテーブル値関数です。