1. ホーム
  2. sql

Dapperはlike演算子をサポートしていますか?

2023-11-10 04:51:34

質問

Dapper-dot-netを使用しています...

以下は、データオブジェクトに何も結果をもたらしません。

var data = conn.Query(@"
    select top 25 
    Term as Label, 
    Type, 
    ID 
    from SearchTerms 
    WHERE Term like '%@T%'", 
    new { T = (string)term });

しかし、通常のString Formatを使用すると、次のようになります。

string QueryString = String.Format("select top 25 Term as Label, Type, ID from SearchTerms WHERE Term like '%{0}%'", term);
var data = conn.Query(QueryString);

コレクションに25行が戻ってきました。 Dapperはパラメータの最後を正しくパースしていないのでしょうか? @T ?

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

試してみてください。

term = "whateverterm";
var encodeForLike = term => term.Replace("[", "[[]").Replace("%", "[%]");

string term = "%" + encodeForLike(term) + "%";
var data = conn.Query(@"
   select top 25 
  Term as Label, 
  Type, 
  ID 
  from SearchTerms 
  WHERE Term like @term", 
  new { term });

パラメータを文字列リテラルの中に入れても動作せず、代わりに文字列として解釈されます。

ノート

2番目のスニペットのハードコードされた例は、SQLインジェクションの大きな問題であることに加え、dapperのリークを引き起こす可能性があるため、強くお勧めしません。

注意点

任意の like というマッチはSARGableではありません。これは、インデックススキャンが必要であり、遅いことを意味します。