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

dapper sql

質問

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形式を使用しています:

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インジェクションに大きな問題があるだけでなく、大まかなリークを引き起こす可能性があります。

警告

ワイルドカードを使用しているlike一致はSARGableではありません。つまり、速度が遅く、インデックススキャンが必要です。


人気のある回答

これを使用してクエリでconcat関数を追加するのに最適な方法ですが、SQLインジェクションでも保存されますが、concat関数はsql 2012以上のサポートしかありません

string query = "SELECT * from country WHERE Name LIKE CONCAT('%',@name,'%');"
var results = connection.query<country>(query, new {name});


ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ