虽然有必要从一个LINQ驱动程序切换到另一个LINQ驱动程序(例如,因为在第一个驱动程序中可能不支持某些想要的表达式),应该使用哪种切换 - AsEnumerable
或ToList
?
var r = ent.Users.Select(user => new
{
user.Name,
Organs = user.Attributes.Select(x => x.Organ)
})
.AsEnumerable() // switch to LINQ to Objects
.Select(user => new
{
user.Name,
Organs = string.Join(", ", user.Organs)
});
我理解AsEnumerable
是延迟的,因此它不会立即枚举来源,但是在实践中,与ToList
作为切换的用法有何重大区别?
对于要在此处运行的LINQ to Objects,来自SQL的数据应该已经可用 - 因此,如果在交换机的位置使用,ToList()
将会执行此操作。在评估表达式树的同时,AsEnumerable
的使用是否强制在内部调用类似ToList
的内容?
答案 0 :(得分:5)
.ToList()
将在内存中构建一个新的List<T>
并将所有对象存储在其中
那是不必要的工作;你应该致电.AsEnumerable()
。
通常,只有在需要多次迭代时(并且只在查询链的末尾)才应调用.ToList()
。
答案 1 :(得分:0)
虽然@SLaks已经回答了你的问题,但为了清楚起见,我会引用MSDN来.AsEnumerable()
做什么:
AsEnumerable(IEnumerable)方法无效 除了从类型更改源代码的编译时类型 将IEnumerable实现为IEnumerable本身。
与ToList()
无关。