2013年9月18日更新
これを行う簡単な方法はないようです。私は、Entity Framework の拡張を含むソリューションを待ち望んでいます。
Entity Framework でこれらの機能を確認したい場合は、ユーザーの声のサイトで投票してください。
SOにはいくつかの同様の質問がありますが、探している答えを得るのに十分なほど新しくて類似した質問が見つかりません。
これが情報過多のように見える場合は、[概要] にジャンプしてください。
バックグラウンド
OData エンドポイントを介して既存のデータを公開する WebApi REST サービスを作成しています。私は を使用してEntitySetContoller<TEntity, TKey>
、面倒な作業をすべて行っています。基本クラスによってルーティングおよび変換される標準の OData パラメーターに加えて、いくつかのカスタム パラメーターを追加して、コントローラーに特定の機能を許可します。
私のデータベースサーバーは、テーブルの[BigText] NVarChar[4000]
列に全文索引がある MS SQL Serverです。[SomeEntity]
制限が 1 つあります。Code First モデルを使用する必要があります。
// Model POCO
public class SomeEntity
{
public int Id { get; set; }
public string BigText { get; set; }
}
// Simple Controller
public class SomeEntityController : EntitySetController<SomeEntity, int>
{
private readonly SomeDbContext context = new SomeDbContext();
public override IQueryable<SomeEntity> Get()
{
var parameters = Request.GetQueryNameValuePairs()
.ToDictionary(p => p.Key, p => p.Value);
if (parameters.ContainsKey("BigTextContains")
(
var searchTerms = parameters["BigTextContains"];
// return something special ...
)
return this.context.SomeEntities;
}
// ... The rest is omitted for brevity.
}
問題
// return something special ...
私の例の一部を実装する方法は?
ナイーブはもちろん
return this.context.SomeEntities.Where(e =>
e.BigText.Contains(searchTerm));
完全に間違っています、それは次のWHERE
ような句に構成されます
[BigText] LIKE '%' + @searchTerm + '%'
これは全文検索を使用しないため、複雑な検索用語をサポートしていません。
このアプローチ、
return this.context.SomeEntities.SqlQuery(
"SELECT E.* FROM [dbo].[SomeEntity] E " +
"JOIN CONTAINSTABLE([SomeEntity], [BigText], @searchTerm) FTS " +
" ON FTS.[Key] = E.[Id]",
new object[] { new SqlParameter("@searchTerm", searchTerm) })
.AsQueryable();
有望に見えますが、実際には全文検索を使用しており、非常に機能的です。DbSqlQuery
ただし、関数から返される型は をSqlQuery
実装していないことに注意してくださいIQueryable
。ここでは、拡張で正しい戻り値の型に強制されていますAsQueryable()
が、これは「構成の連鎖」を壊します。サーバー上で実行される唯一のステートメントは、上記のコードで指定されたものです。OData URL で指定された追加の句は、データベース エンジンのインデックスおよび特殊なセット ベースの機能を利用することなく、API ホスティング Web サーバーで処理されます。
要約すれば
Entity Framework 5 Code First モデルを使用してMS SQL Server の全文検索CONTAINSTABLE
機能にアクセスし、「構成可能な」結果を取得する最も適切な方法は何ですか?
自分で書く必要がありIQueryProvider
ますか? 何らかの方法で EF を拡張できますか?
Lucene.Net を使用したくありません。データベース生成モデルも使用したくありません。おそらく、追加のパッケージを追加するか、EF6 を待つことができますか?