在Dapper中检查列表参数的null

Aja*_*dex 8 parameters dapper

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

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

select * from Table1 where (@ids IS NULL OR id in @ids)
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ell 9

id in @ids是一种被小巧玲珑识别并被视为扩展的模式 - 因此根据输入中的项目数量ids,这可能会成为以下之一:

(1 = 0) -- empty sequence
(id = @ids_0) -- sequence with 1 element
(id in (@ids_0, @ids_1, ...)) -- sequence with multiple elements
Run Code Online (Sandbox Code Playgroud)

正因为如此,扩建后,也就是没有任何@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();
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,我最终这样做了。我还在考虑使用另一个参数(@idsRef)作为标志,例如:where(@idsRef=0 OR id in @ids)。 (2认同)
  • 我有同样的问题,类似(@ idsCount = 0或@ids中的id) (2认同)

gia*_*min 9

where Id in @ids or 0=@listCount
Run Code Online (Sandbox Code Playgroud)

进而

var data = conn.Query<SomeType>(sb.ToString(), new { ids, listCount=ids.Count }).ToList();
Run Code Online (Sandbox Code Playgroud)

  • 太感谢了! (2认同)
  • 干净又优雅! (2认同)