WHERE 子句中 Dapper 上的参数字符串

Param string on Dapper in WHERE clause

我的方法的 WHERE 子句上的参数字符串有问题。我正在尝试执行这样的查询:

string query = "SELECT * FROM table WHERE Name @Filter OR Email @Filter";

然后在我的 switch 中,它们的情况如下:

public async Task<List<DTO>>Get(FilterDTO filter)
{
    foreach(var f in filter.fields)
    {
        switch(f.Operator)
        {
            case 1:
                if(f.Value == null)
                {
                   f.Value = "IS NULL";
                   queryResult = connection.Query<Model>(query, new {Filter = f.Filter});
                   break;
                }
                else
                    goto case 2;

我的参数字符串有很多问题,因为我看不到调试失败的原因

注意我的真实值名称是 FilterValue(此代码是一个简化)

我收到这个错误:

Incorrect syntax near @Filter

所以我知道我的参数字符串输入有问题,但我看不到它是什么

可能 Dapper 正在使用此查询:

SELECT * 
FROM table 
WHERE Name = IS NULL OR Email = IS NULL

这是无效的。

首先创建一个分析器来查看 dapper 在数据库上实际执行的是什么查询(更容易调试这种情况 - 我推荐 MiniProfiler lib)。

其次,IS NULL 过滤器用于查询字符串或使用:Name = NULL 而不是 IS NULL

我认为您不能像这样使用 Dapper 中的参数。 要进行有效查询,您需要

SELECT * FROM table WHERE Name = @Filter OR Email = @Filter;

但这不适用于 null。

您实际上需要创建查询,而不仅仅是参数

const string query = "SELECT * FROM table WHERE Name {0} OR Email {0}";
var result = conn.Query(string.Format(query, filterValue));

编辑: 如果您可以使用 Dapper.SqlBuilder,您也可以使用 Dapper 构建查询。 像这样:

var sqlBuilder = new SqlBuilder();
string myFilterValue = null;
if (string.IsNullOrEmpty(myFilterValue))
{
    sqlBuilder.OrWhere("Name IS NULL").OrWhere("Email IS NULL");
}
else
{
    sqlBuilder.OrWhere("Name = @Filter", new { Filter = myFilterValue }).OrWhere("Email = @Filter", new { Filter = myFilterValue });
}
var template = sqlBuilder.AddTemplate("select * from table /**where**/");
using var conn = new SqlConnection("");
var result = conn.Query(template.RawSql, template.Parameters);

将查询重写为:

SELECT * FROM table WHERE (@Filter is null and Email is null or @Filter = Email) 
                    OR    (@Filter is null and Name is null or @Filter = Name)

在这种情况下,您可以设置参数 Filter = null 并获得预期的结果。