使用 Dapper ORM 在列表中选择 WHERE;如果检查为空则异常

问题描述 投票:0回答:1

带有 Dapper 的 SQL Server

List<string> valueList = new List<string> { "20230626", "20230808"};
string sql = "SELECT * FROM MyTable WHERE @Values is null OR Value IN @Values";
var result = connection.Query<dynamic>(sql, new { Values = valueList });

SqlException 在需要条件的上下文中指定的非布尔类型表达式,靠近“,”。

如果是这样,那么就可以了

List<string> valueList = null

不进行NULL检查,工作正常

SELECT * FROM MyTable WHERE Value IN @Values
  1. 使用 IN 参数时,Dapper 是否会重写查询?
  2. 是否有不使用动态 SQL 或表值参数或类似参数的解决方法?
c# dapper
1个回答
0
投票

1。 Dapper 使用 IN 参数时是否会重写查询?

是的这正是它的作用。如果您有一个大型数据集,这是您应该避免这种情况的原因之一:SQL Server 中的最大参数数量是 2100,在此之前您就会遇到性能问题。

2。是否有不使用动态 SQL 或表值参数或类似参数的解决方法?

表值参数是理想的选择。 这些 答案展示了如何使用它,非常简单。

否则,您可以执行以下操作:

var valueList = new List<string> { "20230626", "20230808"};
string sql = @"
SELECT *
FROM MyTable
WHERE @ValuesEmpty = 1
   OR Value IN @Values;
";

using var result = connection.Query<dynamic>(sql, new { Values = valueList, ValuesEmpty = valueList.Count == 0 });
© www.soinside.com 2019 - 2024. All rights reserved.