我必须从数据库中选择一些项目。这些项目的ID位于List
。
在回答here中,Jon Skeet声明我们可能会使用Contains()
var foo = channel.AsQueryable<CodeData>()
.Where(codeData => codeIDs.Contains(codeData.CodeId));
在数据库庞大且ID列表非常小的环境中,它的表现如何?
Linq是否足够聪明,可以在SQL中使用IN
子句?
编辑:我正在使用DataContext和SQL Server 2008
答案 0 :(得分:7)
是的,LINQ 2 SQL将在此方案中使用IN
子句。
但不是因为它“聪明”并且检测到你有一个巨大的数据库和一个小的id列表。
IN
子句是LINQ 2 SQL“知道”在SQL中表达List.Contains
的方式。
事实上,如果您有1000个项目的列表,您将看到包含1000个参数的IN
子句。
如果您有超过2100个ID的列表,那么您将在SQL客户端中遇到限制,该限制不允许在命令上使用超过2100个参数。但LINQ 2 SQL很乐意生成一个命令,例如,甚至有5000个参数。