在Dapper中检查列表参数的null

时间:2013-09-09 01:30:05

标签: parameters dapper

当参数类型是IEnumerable时,有没有办法检查null?我知道Dapper会将list参数转换为参数化查询,所以我怀疑这就是为什么list参数不能被检查为null的原因,但我想知道是否有办法实现这种行为。

这个想法是做这样的事情:

select * from Table1 where (@ids IS NULL OR id in @ids)

现在该查询将抛出SqlException并显示以下消息:必须声明标量变量“@ids”。 ')'附近的语法不正确。

2 个答案:

答案 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();