c# - LINQ to SQL 到 LINQ to Objects - 通过 AsEnumerable 或通过 ToList 切换

标签 c# 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 之类的内容?

最佳答案

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

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

关于c# - LINQ to SQL 到 LINQ to Objects - 通过 AsEnumerable 或通过 ToList 切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16279923/

相关文章:

c# - 按 T​​AB 键时绕过 DataGridView 中的只读单元格

c# - 使用 LINQ 过滤列表

c# - 包含 LINQ 查询的重构方法

c# - LINQ 查询中的 WHERE 子句似乎失败

c# - LINQ 中的最大日期记录

c# - MySQL调用存储过程错误

c# - 根据范围数据查找值

c# - Brother QL 打印机 SDK - 不打印,没有任何反应 (QL-710W)

c# - 序列不包含元素 - 堆栈跟踪中没有信息

c# - LINQ 查询和上下文