的IQueryable 根据我的理解,在LINQ to SQL&对象,在我执行查询之前,我可以添加更多表达式。
在此示例中,当我尝试执行Query2时,query1和Query2成为最终查询。我对吗? 或者,如果'Numbers'是DB,我是对的吗?
int[] Numbers= new int[] { 1, 2, 3, 4 };
IQueryable<int> Query1 = from X in Numbers.AsQueryable()
where X > 1
select X;
IQueryable<int> Query2 = from X in Query1
where X > 2
select X;
//if I do this: Query2.Count() -> before it executes this, those two queries become one query (FinalQuery)?
IQueryable<int> FinalQuery = from X in Query2
where X > 2
select X;
但是,如果我使用IEnumerable,它会执行Query1并获得IEnumerable。然后它会执行Query2并获得最终的IEnumerable? ;它会执行2个查询吗?
答案 0 :(得分:1)
在尝试实际使用结果之前,IEnumerable和IQueryable LINQ查询都不会执行。它们都只是包含相同名称的扩展方法的类。但他们都“懒惰”,因为他们返回新的查询,而非实际结果。
一般的区别是IEnumerable使用Funcs(本质上是委托)作为查询的底层存储,而IQueryable使用表达式树(例如,可以将查询“翻译”为SQL)。
答案 1 :(得分:1)
如果我使用IEnumerable,它会执行Query1并获得IEnumerable。然后它会执行Query2并获得最终的IEnumerable?
是。但它们将同时执行,每个数字X
将“流过”两个查询。这被称为“懒惰评估”或“延迟执行”。
它会执行2次查询吗?
是。及时重叠。
[使用IQueryable]因为它执行此操作,这两个查询成为一个查询(FinalQuery)?
没有
与IQueryable<>
一样,IEnumerable<>
完全相同。没有“智能”组件可以优化where X > 1
。