12

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

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

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

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

4

2 回答 2

13

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();
于 2013-09-09T08:01:27.483 回答
13
where Id in @ids or 0=@listCount

接着

var data = conn.Query<SomeType>(sb.ToString(), new { ids, listCount=ids.Count }).ToList();
于 2019-09-16T14:05:01.723 回答