当参数类型是 IEnumerable 时,有没有办法检查 null?我知道 Dapper 会将 list 参数转换为参数化查询,所以我怀疑这就是无法检查 list 参数是否为 null 的原因,但我想知道是否有办法实现这种行为。
这个想法是做这样的事情:
select * from Table1 where (@ids IS NULL OR id in @ids)
现在该查询抛出 SqlException 并显示以下消息:必须声明标量变量“@ids”。')' 附近的语法不正确。
当参数类型是 IEnumerable 时,有没有办法检查 null?我知道 Dapper 会将 list 参数转换为参数化查询,所以我怀疑这就是无法检查 list 参数是否为 null 的原因,但我想知道是否有办法实现这种行为。
这个想法是做这样的事情:
select * from Table1 where (@ids IS NULL OR id in @ids)
现在该查询抛出 SqlException 并显示以下消息:必须声明标量变量“@ids”。')' 附近的语法不正确。
这id in @ids
是一种被 dapper 识别并被视为扩展的模式- 因此,根据您输入中的项目数量ids
,这可能成为以下之一:
(1 = 0) -- empty sequence
(id = @ids_0) -- sequence with 1 element
(id in (@ids_0, @ids_1, ...)) -- sequence with multiple elements
正因为如此,在扩展之后,没有参数/变量 - 所以是行不通的。因此,我建议在您的情况下执行此操作的最佳方法很简单:不要添加 tsql 的那部分。例如:@ids
@ids IS NULL
var sql = new StringBuilder("select * from Table1");
if(ids != null && ids.Any())
{
sql.Append(" where id in @ids");
}
var data = conn.Query<SomeType>(sb.ToString(), new { ids }).ToList();
where Id in @ids or 0=@listCount
接着
var data = conn.Query<SomeType>(sb.ToString(), new { ids, listCount=ids.Count }).ToList();