2009-07-08 60 views
4

代码:什么是使用LINQ枚举的正确方法?

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

db.rows.Take(30)是LINQ到SQL

我使用ToList()来枚举的结果,因此查询的其余部分没有翻译到SQL

这是最快的方法吗? ToArray的()?

+0

我遇到的一个有趣事实是,对于通过在投影中使用通过组联接定义的组导致相关查询,导致Linq to SQL添加另一个子查询以检索该组的计数。我假设这意味着在这些情况下,在检索项目之前将知道集合的大小,因此可以直接创建精确大小的数组,从而节省处理和内存资源,同时实现结果。 – jpierson 2010-06-28 20:03:28

回答

13

使用Enumerable.AsEnumerable

var result = db.rows 
       .Take(30) 
       .AsEnumerable() 
       .Select(a => AMethod(a)); 
+3

对于那些没有点击链接的人,所有的AsEnumerable都会返回它的参数类型IEnumerable 。这将保留延迟执行并消除对由ToList()或ToArray()创建的中间数据结构的需求。 – dahlbyk 2009-07-08 19:16:54

2

使用Enumerable.AsEnumerable(),如果你不想immidiatly执行数据库查询,因为,因为AsEnumerable()仍将deffer数据库查询执行,直到你开始枚举LINQ到对象查询。

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

我假设在两次调用中,行都被读入一个可变大小的容器中,因为行数目还不知道。所以我倾向于说ToList()可能会快一点,因为行可以直接读入列表中,而ToArray()可能首先将行读入一种列表中,然后在所有行被传输后复制到一个数组中。