Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
LINQ查询实际何时执行?_Linq - Fatal编程技术网

LINQ查询实际何时执行?

LINQ查询实际何时执行?,linq,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 ==

假设我们有以下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的LINQ查询对象时吗 ?

如果数据号太大,是否有延迟查询 机械装置我不确定用什么词来形容这个,但是 我希望你能理解我


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


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

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


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

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

从来没有一个完全物化的数据结果集,所以它也不能太大


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

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

从来没有一个完全物化的数据结果集,所以它也不能太大


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

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

foreach ( string name in query ) ...
//Roughly translates into
while (query.MoveNext())
{
    string name = query.Current;
    ...
}
它只会在需要时一个接一个地得到结果。这种“惰性”/“流式”思维贯穿于整个查询-根据需要选择调用OrderBy,根据需要调用Where,根据需要调用Collection


一个奇怪的地方是“OrderBy”,出于实现的原因,它可能在对结果排序之前检索所有需要的结果,然后对结果进行流式处理。此检索将在第一次调用时发生。

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

foreach ( string name in query ) ...
//Roughly translates into
while (query.MoveNext())
{
    string name = query.Current;
    ...
}
它只会在需要时一个接一个地得到结果。这种“惰性”/“流式”思维贯穿于整个查询-根据需要选择调用OrderBy,根据需要调用Where,根据需要调用Collection


一个奇怪的地方是“OrderBy”,出于实现的原因,它可能在对结果排序之前检索所有需要的结果,然后对结果进行流式处理。此检索将在第一次调用时进行。

我想您可能有一些以上语法错误。您正在选择一个匿名类型,然后说所选对象是Customer类型,然后像IEnumerable一样迭代查询。谢谢您的提醒。现在更正。我想你可能有一些语法错误上面。您正在选择一个匿名类型,然后说所选对象是Customer类型,然后像IEnumerable一样迭代查询。谢谢您的提醒。现在更正。这是否假定Linq为对象?如果是这样的话,那么如果是Linq到Sql或实体框架,您的答案会有什么不同吗?这些细节假设LinqToObjects,尽管所有实现都应该尝试使用惰性IIRC。例如,MongoDB将在第一次调用时编译并向DB发送查询,并返回一个“MongoCursor”,它将处理每次迭代IIRC的文档获取。[它可能一次批处理4MB的文档IIRC]。这是否假定Linq为对象?如果是这样的话,那么如果是Linq到Sql或实体框架,您的答案会有什么不同吗?这些细节假设LinqToObjects,尽管所有实现都应该尝试使用惰性IIRC。例如,MongoDB将在第一次调用时编译并向DB发送查询,并返回一个“MongoCursor”,它将处理每次迭代IIRC的文档获取。[它可以一次批处理4MB的文档IIRC]。