LINQ to SQL转换为LINQ to Objects -通过AsEnumerable或ToList进行切换

本文关键字:LINQ to ToList -通过 SQL 转换 Objects AsEnumerable | 更新日期: 2023-09-27 18:11:15

当有必要从一个LINQ驱动程序切换到另一个LINQ驱动程序时(例如,因为一些想要的表达式在第一个LINQ驱动程序中可能不支持)应该使用哪种切换- AsEnumerableToList ?

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之类的东西?

LINQ to SQL转换为LINQ to Objects -通过AsEnumerable或ToList进行切换

.ToList()将在内存中构建一个新的List<T>,并将所有对象存储在其中。
那是不必要的工作;你应该调用.AsEnumerable()

一般来说,您应该只在需要多次迭代时调用.ToList()(并且仅在查询链的末尾)。

虽然@SLaks已经回答了你的问题,但为了清楚起见,我将引用MSDN关于.AsEnumerable()的作用:

AsEnumerable(IEnumerable)方法不起作用而不是将源代码的编译时类型从实现IEnumerable到IEnumerable本身。

ToList()无关