使用LINQ进行枚举的正确方式是什么?

6

代码:

 var result = db.rows.Take(30).ToList().Select(a => AMethod(a));

db.rows.Take(30) 是 Linq-To-SQL。

我使用 ToList() 枚举结果,所以查询的其余部分不会被翻译成 SQL。

哪种方法最快?ToArray() 吗?


我发现的一个有趣的事实是,由于在投影中使用了通过组联接定义的组,导致相关查询会引起 Linq to SQL 添加另一个子查询来检索该组的计数。我认为这意味着在这些情况下,在检索项目之前将会知道集合的大小,因此可以直接创建精确大小的数组,这将节省处理和内存资源,并实现结果的物化。 - jpierson
2个回答

14

3
对于那些不点击链接的人来说,AsEnumerable() 的作用就是将其参数转化为 IEnumerable<T> 类型。这样可以保留延迟执行并消除由 ToList() 或 ToArray() 创建的中间数据结构的需要。 - dahlbyk

2

如果您不想立即执行数据库查询,可以使用Enumerable.AsEnumerable(),因为AsEnumerable()仍将推迟数据库查询的执行,直到开始枚举LINQ对象查询。

如果您确定需要数据和/或希望立即执行数据库查询,请使用Enumerable.ToList()Enumerable.ToArray()。性能差异应该不会太大。

我假设在两个调用中,首先将行读入变量大小的容器中,因为尚未知道行数。因此,我倾向于认为ToList()可能会更快,因为行可以直接读入列表中,而ToArray()可能会首先将行读入一种列表中,然后在所有行传输完毕后将其复制到数组中。


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