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 并获得预期的结果。
我的方法的 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 并获得预期的结果。