虽然有必要从一个 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
之类的内容?
最佳答案
.ToList()
将建立一个新的List<T>
内存中并存储其中的所有对象。
这是不必要的工作;你应该打电话.AsEnumerable()
.
一般来说,您应该只调用.ToList()
当您需要多次迭代时(并且仅在查询链的末尾)。
关于c# - LINQ to SQL 到 LINQ to Objects - 通过 AsEnumerable 或通过 ToList 切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16279923/