1. ホーム
  2. c#

[解決済み] エンティティフレームワーク EF.Functions.Likeとstring.Containsの比較

2023-05-17 14:20:39

質問

エンティティフレームワークコア2.0の発表を読みました。 https://blogs.msdn.microsoft.com/dotnet/2017/08/14/announcing-entity-framework-core-2-0/

のような新しい Sql 関数が追加されたと書かれています。 EF.Functions.Like のようにSQLを実行するための LIKE 操作を実行します。

私は不思議に思ったのですが、それなら EF.Functions.Likestring.Contains / StartsWith ?

例えば

var customers = context.Customers.Where(c => c.Name.StartsWith("a")); // Version A
var customers = context.Customers.Where(c => EF.Functions.Like(c.Name, "a%")); // Version B

2つのバージョンの違いは何でしょうか? EFはすでに翻訳する方法を知っています string.Contains / StartsWith を対応するSQL操作に変換していますね。

私が思いつく唯一の理由は、EF.Functions.Likeが以下のようなもっと複雑なパターンを可能にするからです。 "a%b%" (のような複雑なパターンが可能になるからです(ただし、これは StartsWith("a") && Contains("b") )

これが理由でしょうか?

どのように解決するのですか?

クエリのように ワイルドカード文字 をサポートしており、いくつかのシナリオでは文字列拡張メソッドと比較して非常に便利です。

例えば、'ri' を中間文字とする 4 文字の名前をすべて検索する場合、次のようになります。 EF.Functions.Like(c.Name, "_ri_");

または、母音で始まる都市からすべての顧客を取得するために、次のようにします。

var customers = from c in context.Customers 
                   where EF.Functions.Like(c.City, "[aeiou]%")
                   select c;

(SQLクエリへの変換がどのように異なるかについては@Tsengの回答を読んでください)