当参数类型是IEnumerable时,有没有办法检查null?我知道Dapper会将list参数转换为参数化查询,所以我怀疑这就是为什么list参数不能被检查为null的原因,但我想知道是否有办法实现这种行为。
这个想法是做这样的事情:
select * from Table1 where (@ids IS NULL OR id in @ids)
现在该查询将抛出SqlException并显示以下消息:必须声明标量变量“@ids”。 ')'附近的语法不正确。
答案 0 :(得分:7)
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
因此,在扩展之后, 没有@ids
参数/变量 - 因此@ids IS NULL
无法正常工作。因此,我建议最好的方法来实现这个在你的情况下就是:不要添加tsql的那部分。例如:
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();
答案 1 :(得分:1)
where Id in @ids or 0=@listCount
然后
var data = conn.Query<SomeType>(sb.ToString(), new { ids, listCount=ids.Count }).ToList();