Enumerable.AsEnumerable<>()强制计算表达式吗?
Enumerable.AsEnumerable<>()强制计算表达式吗?
string[] fruits = { "apple", "passionfruit", "banana", "mango", "orange", "blueberry", "grape", "strawberry" }; Listlengths = fruits.Select(fruit => fruit.Length).ToList();
\nEnumerable.ToList()
或者 Enumerable.ToArray()
执行的是急切求值,它们会强制执行求值。\nEnumerable.AsEnumerable()
是否也是如此?\n谢谢
Enumerable.AsEnumerable<>()并不强制对表达式进行评估。它的实际作用是将输入的集合转换为另一种接口的类型,并返回该集合。它的唯一实际目的是将IQueryable<T>
转换为IEnumerable<T>
,以便后续的LINQ方法使用可枚举版本而不是可查询版本进行操作,使评估转移到“客户端”上。
然而,它本身并不做任何操作。但是,将评估转移到客户端并不是什么都不做:它可能涉及从数据库传输大量数据到客户端。这就是为什么在最新的EF版本中,这种转换不再自动进行。
它本身并没有任何操作。它只是改变了持有它的变量的编译时类型,从而导致进一步的调用选择不同的重载。使用强制转换或者as
关键字也能达到相同的效果。