FirstorDefault()导致延迟加载或急切加载linq到sql

时间:2013-05-31 14:48:15

标签: linq c#-4.0 linq-to-sql

与Linq to SQL一起使用时,FirstOrDefault()的默认行为是什么?

例如

  int value =   (from p in context.tableX         
                select p.Id).FirstOrDefault()      // Value will initialized here or

   if(value > 0)                      // query will be executed here????
   {
    //do something
   }

由于

4 个答案:

答案 0 :(得分:11)

  

与Linq to SQL一起使用时,FirstOrDefault()的默认行为是什么?

它急切地计算查询的结果。最简单的方法是认识到返回类型为int,而不是IEnumerable<int>可以延迟到GetEnumerator被调用,但是{{} 1}}没有这样的机制。

你的问题的措辞表明你也在问是否有办法改变这种行为。有,但不是直接通过int或LINQ中的任何机制。但您可以使用Lazy<T>推迟。没有编译器方便,所以请原谅我,如果这不编译但它应该让你非常接近。

FirstOrDefault

答案 1 :(得分:9)

返回单个,不可枚举结果的所有标准Linq运算符将立即在声明的查询点执行。因此,FirstOrDefaultCountSum和其他返回单个值的运算符会立即执行。

这是一篇很好的MSDN文章Classification of Standard Query Operators by Manner of Execution

答案 2 :(得分:2)

急切加载!

如果您考虑一下,它只会返回一个简单的int - int无法代表“一种方法去获得int”。 (这就是Lazy<int>的用途......)

答案 3 :(得分:2)

当你对可枚举的结果使用扩展方法时,它变为Eager加载。如果你不使用这些扩展方法,它将是延迟加载,你实际上不能获取值,直到你枚举linq结果