8

基本的にやっているEFで使用しているLINQのラインがありますmyTable.Where(c => c.Contains('mystring'));

生成されたコードは次のとおりです。

SELECT TOP (300) 
[Extent1].[ID] AS [ID], 
[Extent1].[FKFishEntityID] AS [FKFishEntityID], 
[Extent1].[Fish] AS [Fish], 
[Extent1].[FishText] AS [FishText], 
[Extent1].[FishType] AS [FishType]
FROM [dbo].[Fish] AS [Extent1]
WHERE [Extent1].[FishText] LIKE @p__linq__0 ESCAPE '~'

私の2つの質問は次のとおりです。

  • LIKE の代わりに CONTAINS(...) を使用するにはどうすればよいですか? テーブルがフルテキスト インデックスを使用している場合、LIKE は非常に遅いようです。クエリをコピーして貼り付けると、実行に 4 秒かかりますが、LIKE を CONTAINS() に変更すると、すぐに実行されます。

  • ESCAPE '~' を実行するのはなぜですか? これをSQLサーバーにコピペすることで、「ESCAPE」の部分を外すと約4倍速く実行できます。

4

1 に答える 1

4

[エンティティ フレームワーク ブログ] から: 1

現時点では、全文検索のネイティブ サポートは予定されていません。生の SQL クエリを使用する必要があります。

行き方は以下のようになっているようです。

using (var context = new BloggingContext())
{
    var fishes = context.Fishes.SqlQuery("SELECT * FROM dbo.Fishes WHERE CONTAINS(FishText, @p0)", searchPhrase).ToList();
}
于 2013-06-05T14:12:14.580 に答える