当IN子句的值列表来自业务逻辑时,使用Dapper ORM使用IN子句编写查询的最佳方法是什么?例如,假设我有一个查询:
SELECT * FROM SomeTable WHERE id IN (commaSeparatedListOfIDs)
在commaSeparatedListOfIDs正在从业务逻辑传递,它可以是任何类型的IEnumerable(of Integer)。在这种情况下,我将如何构造查询?到目前为止,我是否必须做我基本上一直在做的事情,即基本上是字符串连接还是我不知道的某种高级参数映射技术?
commaSeparatedListOfIDs
IEnumerable(of Integer)
查看更多
Dapper直接支持这一点。例如...
string sql = "SELECT * FROM SomeTable WHERE id IN @ids" var results = conn.Query(sql, new { ids = new[] { 1, 2, 3, 4, 5 }});
我认为必须注意,数组中可以发送的项目数量是有限的。当我传递太多ID时,我意识到了这是很难的方法。我不记得确切的数字,但是从我的记忆中,我认为这是200个元素,Dapper停止工作/执行查询。
马可,那很重要。而且,如果您这样做,则可以考虑寻找另一种查询数据的方式,例如进行联接或反联接,而不是传递ID列表。IN子句不是性能最高的查询,通常可以用一个存在子句代替,这将更快。
仅供参考-SQL Server 2008 R2在该
IN
子句中限制为2100个条目。SQLite的默认限制为999个变量。
当心:在SQL Server中,如果数组中有多个项目并且将参数括在方括号中,则此操作将失败。卸下支架将解决此问题。