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

时间:2013-04-29 13:31:07

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

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:0)

虽然@SLaks已经回答了你的问题,但为了清楚起见,我会引用MSDN.AsEnumerable()做什么:

  

AsEnumerable(IEnumerable)方法无效   除了从类型更改源代码的编译时类型   将IEnumerable实现为IEnumerable本身。

ToList()无关。