首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对Linq-to-Entities查询结果的Linq-to-Objects查询操作的一些混淆

对Linq-to-Entities查询结果的Linq-to-Objects查询操作的一些混淆
EN

Stack Overflow用户
提问于 2012-10-30 04:54:46
回答 1查看 102关注 0票数 1

Linq to objects表达式返回一个对象,该对象在枚举时会从序列中生成元素。通常,延迟的LINQ-to-Object方法充当管道,因此序列的每个元素在处理下一个元素之前流经处理管道。

a)但是如果Linq- to -Objects查询对Linq- to -Entities查询的结果进行操作,则当foreach试图迭代search时,在处理下一个元素(换句话说,是从DB检索的序列中的第一个元素,然后由Enumerable.Where处理,然后由Enumerable.SelectMany处理,然后才是从DB检索的下一个元素)或者是立即从DB检索到的整个元素集(当foreach试图从序列中读取第一个元素时)之前,再次在整个处理序列中流动每个元素,只有到那时,这些元素才开始流经Linq-to-Objects运算符的处理管道?

代码语言:javascript
复制
        var search = context.Contacts.AsEnumerable().
            Where(s => s.ContactID > 10).SelectMany(s => s.Address);

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-30 05:48:03

第一个SQL由EF查询提供程序处理,该提供程序将表达式(从IQueryable)转换为context.Contacts

然后,通过AsEnumerable,与EF查询提供程序的链接被断开,之后的任何东西都是linq to objects,处理来自前一条语句的结果集。

然而,因为Contact.Address是一个延迟加载的集合,所以对于每个通过管道的Contact,都会发出一个新的查询来填充它。这是可能的,因为EF使用Contact的代理类型,该代理类型由通过EF查询提供程序运行查询的getter覆盖Address

正如您可能知道的,当您擦除SQL时,整个语句会变成一个Expression树,EF会将其转换为一条SQL语句。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13129508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档