4

かなり複雑な検索フォームに応じて、さまざまな種類の Where 句をネストする LINQ-2-Entity クエリ ビルダーがあります。これまでのところ素晴らしい作品。

ここで、いくつかのクエリで SQL Server 全文検索インデックスを使用する必要があります。検索用語を LINQ クエリに直接追加し、スコアを選択可能なプロパティとして利用できるようにする機会はありますか?

そうでない場合は、全文検索条件に一致するすべての行 ID のリストを読み込むストアド プロシージャを作成し、LINQ-2-Entity クエリを使用して詳細データを読み込み、他のオプションのフィルター条件をループごとに評価することができます。行。もちろん、それはパフォーマンスに関して非常に悪い考えです。

もう 1 つのオプションは、ストアド プロシージャを使用して、全文検索に一致するすべての行 ID を一時テーブルに挿入し、LINQ クエリで一時テーブルを結合することです。質問: 一時テーブルをエンティティ モデルの一部にすることはできないため、LINQ クエリで一時テーブルを結合する方法は?

4

2 に答える 2

2

おそらくハイブリッドアプローチを提案すると思います。

  1. 必要なすべての情報を返すストアド プロシージャを作成します。
  2. エンティティを結果にマップします。エンティティは、この目的のためだけに作成できます。または、エンティティ フレームワークのバージョン 4 を使用します。これにより、複雑な型をマッピングしてプロシージャの結果を開始できます。ポイントは、プロシージャの結果を既存のエンティティ型に強制しようとする代わりに、それらを独自の型として処理することです。
  3. これで、LINQ to Entities クエリを作成できます。

サンプルクエリ:

var q = from r in Context.SearchFor("searchText")
        let fooInstance = (r.ResultType == "Foo")
            ? Context.Foos.Where(f => f.Id == r.Id)
            : null
        where ((fooInstance == null) || (fooInstance.SpecialCriterion == r.SpecialCriterion))    
        select {
            // ...

これは私の頭から離れているため、構文が正しくない可能性があります。重要な点は、検索結果をエンティティとして扱うことです。

別の方法: より柔軟な FTS システムを使用して、インデックスを作成するときに「特別な」タイプごとのフィルタリングを行うことができます。

于 2009-09-18T14:22:18.213 に答える
0

EF4 の次のようなコードを見てきました。

var query = context.ExecuteStoreQuery<Person>(
        "SELECT * FROM People WHERE FREETEXT(*,{0})", 
        searchText
    ).AsQueryable();

これは、ストアド プロシージャまたは UDP を作成するよりも簡単な場合があります。

于 2011-05-25T19:09:36.053 に答える