什么时候LINQ查询实际执行?

时间:2012-08-25 01:07:59

标签: linq

假设我们有以下LINQ查询:

var query =
    from    c in Customers
    where   c.Country == "Italy"
    orderby c.Name
    select  new { c.Name, c.City };

编译器会将其转换为:

IEnumerable<Customer> query =
        Customers
        .Where( c => c.Country == "Italy" );
        .OrderBy( c => c.Name )
        .Select( c => new { c.Name, c.City } );

然后我可以使用这样的查询:

foreach ( var name_city_pair in query ) ...

问题是:

  • 似乎已查询查询指定的数据 当我使用foreach循环时。那么这个查询操作何时发生? 是在我定义IEnumerable<Customer>的LINQ查询对象时

  • 如果数据太大,是否有延迟查询 机制? (我不确定用正确的词来形容这个,但是 我希望你能帮到我。)

3 个答案:

答案 0 :(得分:5)

LINQ尽可能使用延迟执行。在您的示例中,只有在迭代结果时才会执行查询。

To开头的方法(例如ToList)会导致查询立即执行。还有一些返回单个值的方法(如Count)会导致查询立即执行。

答案 1 :(得分:3)

一般来说,LINQ试图尽可能地懒惰。例如,你希望它在幕后看起来像这样:

foreach ( string name in query ) ...
//Roughly translates into
while (query.MoveNext())
{
    string name = query.Current;
    ...
}

只能逐个获得所需的结果。这种“懒惰”/“流式”思维贯穿整个查询 - 根据需要选择调用OrderBy,根据需要调用Where,根据需要调用Collection。

一个奇怪的是'OrderBy',出于实现原因,它可能在订购之前检索所有需要的结果,然后流式传输结果。这种检索将在首次调用时发生。

答案 2 :(得分:1)

查询未在foreach之前执行。 foreach循环中的每次迭代都将从查询中返回一个结果。

从来没有完全具体化的数据结果集,所以也不能太大。

LINQ查询推迟执行。在迭代时,它将使用您指定的谓词和投影在数据上“向前”滑动。