web-dev-qa-db-ja.com

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

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 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の終わりを正しく解析していませんか?

58
Jay Stevens

試してください:

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の一致はSARG可能ではありません。つまり、低速であり、インデックススキャンが必要になります。

62
Sam Saffron

これを使用して、SQLインジェクションでも保存できるようにクエリに連結関数を追加する最良の方法ですが、連結関数はSQL 2012より上でのみサポートされます

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

はい、そうです。この簡単な解決策はいつも私のために働いてきました:

db.Query<Remitente>("SELECT * 
                     FROM Remitentes 
                     WHERE Nombre LIKE @n", new { n = "%" + nombre + "%" })
                   .ToList();
20
eliaquin

サムからの答えは私にとってはうまくいかなかったので、いくつかのテストの後、私は SQLite CONCATの同等物 を使用することを思いつきました:

string sql = "SELECT * FROM myTable WHERE Name LIKE '%' || @NAME || '%'";
var data = IEnumerable data = conn.Query(sql, new { NAME = Name });
3
Dscoduc