使用List.Contain()时,Linq to SQL 的性能如何表现?

3

我需要从数据库中选择一些项目。这些项目的ID在一个List中。

这里的一个答案中,Jon Skeet指出我们可以使用Contains()

var foo = channel.AsQueryable<CodeData>()
                 .Where(codeData => codeIDs.Contains(codeData.CodeId));

在一个数据库非常庞大而ID列表非常小的情况下,它的表现如何?
Linq是否足够智能,可以在SQL中使用“IN”子句?
编辑:我正在使用DataContext和SQL Server 2008。

2
你正在使用SQL Server吗?尝试使用SQL Server Profiler查看生成的SQL。 - Rui Jarimba
性能主要取决于您的数据和现有的索引。 - Jan
据我所知,EF在这种情况下比旧的Linq to SQL更加智能。 - Nagg
@Jan:这将取决于数据和索引以及执行的查询。 - Rui Jarimba
@RuiJarimba 感谢你的建议。可惜我机器上没有 SQL Server Profiler(而且生产服务器还未启动 :)))。 - Jonas Schmid
1
你可以在没有分析器的情况下完成它:https://dev59.com/1W445IYBdhLWcg3wXZEy - Pleun
1个回答

7
是的,在这种情况下,LINQ 2 SQL将使用IN子句。但并不是因为它“聪明”地检测到您有一个巨大的数据库和一个小的ID列表。 IN 子句是 LINQ 2 SQL 如何“知道”在 SQL 中表达 List.Contains 的方法。
事实上,如果您有一个包含1000个项目的列表,您将看到具有1000个参数的IN子句。
如果您有一个超过2100个ID的列表,则会遇到 SQL 客户端中的限制,该限制不允许在命令上有超过2100个参数。但是,LINQ 2 SQL将愉快地生成一个具有5000个参数的命令。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接