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
の終わりを正しく解析していませんか?
試してください:
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可能ではありません。つまり、低速であり、インデックススキャンが必要になります。
これを使用して、SQLインジェクションでも保存できるようにクエリに連結関数を追加する最良の方法ですが、連結関数はSQL 2012より上でのみサポートされます
string query = "SELECT * from country WHERE Name LIKE CONCAT('%',@name,'%');"
var results = connection.query<country>(query, new {name});
はい、そうです。この簡単な解決策はいつも私のために働いてきました:
db.Query<Remitente>("SELECT *
FROM Remitentes
WHERE Nombre LIKE @n", new { n = "%" + nombre + "%" })
.ToList();
サムからの答えは私にとってはうまくいかなかったので、いくつかのテストの後、私は SQLite CONCATの同等物 を使用することを思いつきました:
string sql = "SELECT * FROM myTable WHERE Name LIKE '%' || @NAME || '%'";
var data = IEnumerable data = conn.Query(sql, new { NAME = Name });