与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
}
由于
答案 0 :(得分:11)
与Linq to SQL一起使用时,FirstOrDefault()的默认行为是什么?
它急切地计算查询的结果。最简单的方法是认识到返回类型为int
,而不是IEnumerable<int>
,可以延迟到GetEnumerator
被调用,但是{{} 1}}没有这样的机制。
你的问题的措辞表明你也在问是否有办法改变这种行为。有,但不是直接通过int
或LINQ中的任何机制。但您可以使用Lazy<T>
推迟。没有编译器方便,所以请原谅我,如果这不编译但它应该让你非常接近。
FirstOrDefault
答案 1 :(得分:9)
返回单个,不可枚举结果的所有标准Linq运算符将立即在声明的查询点执行。因此,FirstOrDefault
,Count
,Sum
和其他返回单个值的运算符会立即执行。
这是一篇很好的MSDN文章Classification of Standard Query Operators by Manner of Execution
答案 2 :(得分:2)
急切加载!
如果您考虑一下,它只会返回一个简单的int
- int
无法代表“一种方法去获得int
”。 (这就是Lazy<int>
的用途......)
答案 3 :(得分:2)
当你对可枚举的结果使用扩展方法时,它变为Eager加载。如果你不使用这些扩展方法,它将是延迟加载,你实际上不能获取值,直到你枚举linq结果