我需要确认我对IQueryable&的理解。 IEnumerable的

时间:2012-10-09 12:39:49

标签: c# ienumerable iqueryable

的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个查询吗?

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