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 });

like 运算符没有什么特别之处,你永远不希望你的参数在字符串文字中,它们不会工作,而是会被解释为字符串。

笔记

强烈建议不要使用第二个代码段中的硬编码示例,除了是 sql 注入的一个大问题之外,它还可能导致 dapper 泄漏。

警告

任何like以通配符开头的匹配都不是 SARGable,这意味着它很慢并且需要索引扫描。

于 2011-05-17T12:09:53.637 回答
45

使用它在查询中添加 concat 函数的最佳方法,因为它也保存在 sql 注入中,但 concat 函数仅支持高于 sql 2012

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

Sam 的回答对我不起作用,所以经过一些测试后,我想出了使用SQLite CONCAT 等效的方法,这似乎有效:

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

只是为了偏离 Sam 的答案,这里是我如何创建两个辅助方法以使用 LIKE 运算符使搜索更容易一些。

首先,创建一个用于生成参数化查询的方法,此方法使用动态: ,但在许多需要静态类型而不是动态类型的情况下,应该更需要创建强类型泛型方法。

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}");
}

我们从 Northwind DB 获得样本数据:
样本数据

我喜欢这种方法,因为我们使用辅助扩展方法来完成重复性工作。

于 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 回答