对象表达式的Linq返回一个对象,该对象在枚举时产生序列中的元素。通常,延迟的LINQ-to-Object方法充当流水线,因此序列中的每个元素都会在处理下一个元素之前流经处理管道。对Linq-to-Entities查询操作的Linq-to-Objects查询存在一些混淆
一个)但如果LINQ到对象查询上的LINQ到实体查询的结果进行操作,那么当foreach
试图遍历search
,并再次各元件流过整个处理序列的下一个元素被处理之前(换句话说,是从DB检索的序列中的第一个元素,然后由Enumerable.Where
处理,然后由Enumerable.SelectMany
处理,然后才从DB检索下一个元素),或者是一次从DB检索的整个元素集(当foreach
尝试从序列中读取第一个元素),只有这些元素开始流经Linq-to-Objects运算符的处理管道?
var search = context.Contacts.AsEnumerable().
Where(s => s.ContactID > 10).SelectMany(s => s.Address);
谢谢
1)因此,整个集合一次从DB中检索,只有Enumerable操作符才开始处理元素? 2)即使使用这个查询,Enumerable运算符是否正确,只有当所有的Enumerable运算符完成处理前面的元素时,它才会开始处理特定的元素? – carewithl
db查询运行并在'AsEnumerable'之后,任何linq语句链被评估为一个管道。但必须清楚的是,整个语句(包括db部分)只有在实际枚举时才会执行。 –
我可以问一下“作为一条管线”是什么意思吗? – carewithl