【问题标题】:Execution flow of a linq query一个linq查询的执行流程
【发布时间】:2011-11-12 12:58:33
【问题描述】:

案例1

var numbers = new List<int>();
numbers.Add (1);
IEnumerable<int> query = numbers.Select (n => n * 10);    // Build query
numbers.Add (2);

//Use or execute query  

案例2

var numbers = new List<int>() { 1, 2 };
numbers.Add(4);
List<int> query  = numbers
  .Select (n => n * 10) 
  .ToList();                      // Executes immediately into a List<int>
numbers.Add(3);
numbers.Clear();

//Use or execute query

为什么在第一种情况下查询同时包含 1,2

第二种情况查询只包含1,2,4而不包含3,是不是因为我们调用了.ToList()方法。

【问题讨论】:

    标签: c# .net linq


    【解决方案1】:

    这是因为在您开始枚举结果集之前不会执行查询(通过调用 .ToArray()、.ToList() 或简单地编写一个 foreach)

    IEnumerable<int> query = numbers.Select (n => n * 10);
    

    不执行任何操作。这是 LINQ 的惰性。

    【讨论】:

    • 如果您在选择内的代码上放置一个断点,您可以看到这一点。只有在枚举查询时才会中断。
    【解决方案2】:

    任何返回 IEnumerable&lt;T&gt; 的 Linq 方法都会被延迟,这意味着它在枚举之前不会返回项目。

    ToList&lt;T&gt;() 是非延迟操作。

    【讨论】:

      【解决方案3】:

      linq 使用延迟执行的概念,这意味着它只会在调用 .first .list 等实际工作时执行查询。

      【讨论】:

        【解决方案4】:

        case1 中枚举后执行的查询。

        case2 中,结果不包含3,因为您已经执行了查询并将其结果(这是一个IEnumarable 对象)保存在query 变量中(它不是Linq Query对象。)

        【讨论】:

          【解决方案5】:

          linq 将调用 DB 并仅在 .tolist() 调用时返回实际数据。

          【讨论】:

            猜你喜欢
            • 2023-02-05
            • 1970-01-01
            • 2011-11-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多