Linq查询包含“AsEnumerable()”等价

时间:2016-04-26 18:07:55

标签: c# linq asenumerable

这两个查询在功能上是否相同?

1)

var z=Categories
         .Where(s=>s.CategoryName.Contains("a"))
         .OrderBy(s => s.CategoryName).AsEnumerable()
         .Select((x,i)=>new {x.CategoryName,Rank=i});

2)

var z=Categories.AsEnumerable()
         .Where(s=>s.CategoryName.Contains("a"))
         .OrderBy(s => s.CategoryName)
         .Select((x,i)=>new {x.CategoryName,Rank=i});

我的意思是,查询中“AsNumerable()”的顺序是否会更改从客户端检索的数据项的数量,或者检索它们的方式?

谢谢你的帮助。

2 个答案:

答案 0 :(得分:3)

  

这两个查询在功能上是否相同?

如果通过等效表示最终结果,则可能是(取决于提供程序如何实现这些操作),区别在于您使用内存扩展的第二个查询。

  

我的意思是," AsNumerable()"的顺序是什么?在查询中更改   从客户端检索的数据项数量或它们的方式   检索?

是的,在第一个查询中,WhereOrderBy将转换为 SQL Select将在内存中执行。

在第二个查询中,数据库中的所有信息都被带入内存,然后在内存中进行过滤和转换。

Categories可能是IQueryable,因此您将使用Queryable类中的扩展程序。此版本的扩展接收Expression作为参数,这些表达式树允许将代码转换为sql查询。

AsEnumerable()将对象作为IEnumerable返回,因此您将使用Enumerable类中直接在内存中执行的扩展。

答案 1 :(得分:1)

是的他们以不同的方式做同样的事情。第一个查询执行SQL数据库本身的所有选择,排序和条件。

但是,第二个代码段从数据库中提取所有行并将其存储在内存中。然后,它对所获取的数据进行排序,排序和应用条件,即现在在内存中。

AsEnumerable()将查询分为两部分:

  1. Inside-Part(AsEnumerable之前的查询)作为LINQ-to-SQL
  2. 执行
  3. Outside-Part(AsEnumerable之后的查询)作为LINQ-to-Objects
  4. 执行