2

虽然有必要从一个 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()如果使用它来代替开关,它将执行此操作。在评估表达式树时,无论如何都不会在内部调用AsEnumerableforce的使用吗?ToList

4

2 回答 2

5

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

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

于 2013-04-29T13:33:04.703 回答
0

虽然@SLaks 已经回答了您的问题,但为了清楚起见,我将引用MSDN的内容.AsEnumerable()

AsEnumerable(IEnumerable) 方法除了将源的编译时类型从实现 IEnumerable 的类型更改为 IEnumerable 本身之外没有任何作用。

它与ToList().

于 2013-04-29T15:03:38.753 回答