3

IQueryable 据我了解,在 LINQ to SQL & Object 中,在执行查询之前,我可以添加更多表达式。

在此示例中,当我尝试执行 Query2 时,query1 和 Query2 成为最终查询。我对吗?或者如果“数字”是数据库,我是对的?

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

4

2 回答 2

1

如果我使用 IEnumerable,它会执行 Query1 并获得一个 IEnumerable。那么它将执行 Query2 并获得最终的 IEnumerable?

是的。但它们将被串联执行,每个数字X将“流动”通过两个查询。这就是所谓的“惰性评估”或“延迟执行”。

它会执行 2 个查询吗?

是的。时间重叠。

[Using IQueryable] 在它执行之前,这两个查询变成一个查询(FinalQuery)?

不。

IQueryable<>与with会发生完全相同的事情IEnumerable<>。没有涉及将优化的“智能”组件where X > 1

于 2012-10-09T14:17:18.920 回答
1

在您尝试实际使用结果之前,IEnumerable 和 IQueryable LINQ 查询都不会执行。它们都只是包含同名扩展方法的类。但它们都很“懒惰”,因为它们返回的是新查询,而不是实际结果。

一般的区别是 IEnumerable 使用 Funcs(本质上是委托)作为查询的底层存储,而 IQueryable 使用表达式树(例如,查询可以“翻译”为 SQL)。

于 2012-10-09T12:50:18.057 回答