2016-04-26 63 views
1

这2个查询在功能上是否相同?包含“AsEnumerable()”等效的Linq查询

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()” 的顺序在查询改变从客户端检索的数据项的数目,或他们被检索的方式?

谢谢你的帮助。

+0

是的,订单很重要。请参阅:http:// stackoverflow。com/questions/3311244/understanding-asenumerable -in-linq-to-sql –

+0

这取决于你的LINQ提供者,但你没有指定你正在使用哪一个。 LINQ to SQL?实体框架?还有别的吗? – hvd

+0

LINQ to SQL ...,是的,我应该说。 –

回答

3

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

如果你相当于意味着最终结果,那么很可能是(根据供应商如何实现这些操作),所不同的是在第二个查询您所使用的内存扩展。

我的意思是,确实令“AsNumerable()”查询修改 数量从客户端,或者他们 检索方式检索的数据项的?

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

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


Categories可能是一个IQueryable,所以您将使用在Queryable类的扩展。此版本的扩展接收Expression作为参数,并且这些表达式树允许将您的代码转换为sql查询。

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

+3

'如果相当于你的意思是最后的结果,那么是的,差异在于你在内存扩展中使用的第二个查询;'这不一定是真的。查询提供程序可能会稍微(甚至可能显着)不同于这些操作的内存中等价物的语义。 – Servy

+0

@Servy:这是真的,更新了答案。 –

+2

另外'AsEnumerable'不会“转换”集合,它只是强制编译器将subseuent调用绑定到'IEnumerable'扩展方法而不是'IQueryable'。 –

1

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

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

AsEnumerable()打破了查询分为两个部分:

  1. 所述的内部分(AsEnumerable前查询)作为LINQ到SQL
  2. 外,部分(AsEnumerable后查询)执行是作为LINQ到对象执行