【问题标题】:I need confirmation about my understanding on IQueryable & IEnumerable我需要确认我对 IQueryable 和 IEnumerable 的理解
【发布时间】:2012-09-29 19:08:39
【问题描述】:

可查询 据我了解,在 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 个查询吗?

【问题讨论】:

    标签: c# ienumerable iqueryable


    【解决方案1】:

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

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

    它会执行 2 个查询吗?

    是的。时间重叠。

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

    没有。

    IQueryable&lt;&gt;IEnumerable&lt;&gt; 会发生完全相同的事情。没有涉及将优化where X &gt; 1 的“智能”组件。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我没有说它会在我使用结果之前执行。看例子,看到我写了一行 -> Query2.Count()。所以我问这两个查询是否成为一个查询 - 最终查询。我说的对吗?
      • @StavAlfi 我不太明白。运行 Query2.Count() 会给你一个 int 结果,但不会以任何方式改变 Query2,因为它们是不可变的。你问的是这个吗?
      • 我很难理解自己。我很抱歉浪费你的时间。我希望别人能理解。谢谢你的时间。
      • @Erix 我认为如果在到达最终查询行之前执行查询 2(如 .ToList),FinalQuery 表达式的结果是否不同
      • 当 q2 被执行时,它是否会转换为 finalQuery 之类的东西,然后转换为 SQL?
      猜你喜欢
      • 2016-09-06
      • 1970-01-01
      • 1970-01-01
      • 2012-12-03
      • 1970-01-01
      • 2010-12-27
      • 2014-05-14
      • 1970-01-01
      • 2014-12-24
      相关资源
      最近更新 更多