LINQ to SQL转换为LINQ to Objects -通过AsEnumerable或ToList进行切换
本文关键字:LINQ to ToList -通过 SQL 转换 Objects AsEnumerable | 更新日期: 2023-09-27 18:11:15
当有必要从一个LINQ驱动程序切换到另一个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
之类的东西?
.ToList()
将在内存中构建一个新的List<T>
,并将所有对象存储在其中。
那是不必要的工作;你应该调用.AsEnumerable()
。
一般来说,您应该只在需要多次迭代时调用.ToList()
(并且仅在查询链的末尾)。
虽然@SLaks已经回答了你的问题,但为了清楚起见,我将引用MSDN关于.AsEnumerable()
的作用:
AsEnumerable(IEnumerable)方法不起作用而不是将源代码的编译时类型从实现IEnumerable到IEnumerable本身。
与ToList()
无关