75

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か?

4

6 に答える 6

76

試す:

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

于 2011-05-17T12:09:53.637 に答える
45

これを使用してクエリにconcat関数を追加するのに最適な方法は、sql injectingにも保存されるためですが、concat関数はsql2012より上でのみサポートされます。

string query = "SELECT * from country WHERE Name LIKE CONCAT('%',@name,'%');"
var results = connection.query<country>(query, new {name});
于 2016-03-16T08:14:02.603 に答える
43

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

db.Query<Remitente>("SELECT * 
                     FROM Remitentes 
                     WHERE Nombre LIKE @n", new { n = "%" + nombre + "%" })
                   .ToList();
于 2017-02-12T02:58:28.723 に答える
6

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

string sql = "SELECT * FROM myTable WHERE Name LIKE '%' || @NAME || '%'";
var data = IEnumerable data = conn.Query(sql, new { NAME = Name });
于 2016-07-25T02:44:51.083 に答える
0

サムの答えを逸脱するために、LIKE演算子を使用して検索を少し簡単にする2つのヘルパーメソッドを作成した方法を次に示します。

まず、パラメーター化されたクエリを生成するメソッドを作成します。このメソッドは動的:を使用しますが、動的ではなく静的な型指定が必要な多くの場合、強く型付けされたジェネリックメソッドを作成する方が望ましいでしょう。

public static dynamic ParameterizedQuery(this IDbConnection connection, string sql, Dictionary<string, object> parametersDictionary)
{
    if (string.IsNullOrEmpty(sql))
    {
        return null;
    }
    string missingParameters = string.Empty;
    foreach (var item in parametersDictionary)
    {
        if (!sql.Contains(item.Key))
        {
            missingParameters += $"Missing parameter: {item.Key}";
        }
    }
    if (!string.IsNullOrEmpty(missingParameters))
    {
        throw new ArgumentException($"Parameterized query failed. {missingParameters}");
    }
    var parameters = new DynamicParameters(parametersDictionary);
    return connection.Query(sql, parameters);
}

次に、Dapperで機能するLike検索用語を作成するメソッドを追加します。

public static string Like(string searchTerm)
{
    if (string.IsNullOrEmpty(searchTerm))
    {
        return null;
    }
    Func<string, string> encodeForLike = searchTerm => searchTerm.Replace("[", "[[]").Replace("%", "[%]");
    return $"%{encodeForLike(searchTerm)}%";
}

使用例:

var sql = $"select * from products where ProductName like @ProdName";
var herringsInNorthwindDb = connection.ParameterizedQuery(sql, new Dictionary<string, object> { { "@ProdName", Like("sild") } });

foreach (var herring in herringsInNorthwindDb)
{
    Console.WriteLine($"{herring.ProductName}");
}

そして、NorthwindDBからサンプルデータを取得します。
サンプルデータ

繰り返し作業を行うためのヘルパー拡張メソッドを取得できるので、このアプローチが好きです。

于 2021-06-28T15:20:24.613 に答える
0

この問題に対する私の解決策:

parameter.Add("@nomeCliente", dfNomeCliPesquisa.Text.ToUpper());

query = "SELECT * FROM cadastrocliente WHERE upper(nome) LIKE " + "'%" + dfNomeCliPesquisa.Text.ToUpper() + "%'"; 
于 2022-02-05T21:09:40.053 に答える