FirstorDefault()导致延迟加载或急于加载linq到sql
当与Linq to SQL一起使用时,FirstOrDefault()的默认行为是什么 例如FirstorDefault()导致延迟加载或急于加载linq到sql,linq,c#-4.0,linq-to-sql,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
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
}
感谢您的热切期待
仔细想想,它只返回一个普通的int
,int
不可能代表“一种获得int
的方法”。(这就是懒惰的原因……)
当与Linq to SQL一起使用时,FirstOrDefault()的默认行为是什么
它急切地计算查询的结果。考虑这一点最简单的方法是认识到返回类型是int
,而不是IEnumerable
,它可以延迟到调用GetEnumerator
,但是int
没有这样的机制
你问题的措辞表明你也在问是否有办法改变这种行为。LINQ中存在但不直接通过FirstOrDefault
或任何机制。但是你可以推迟使用。没有编译器在手边,所以请原谅我,如果这不能编译,但它应该让你非常接近
Lazy<int> value = new Lazy<int>(
() => {
var query =
from p in context.tableX
select p.Id;
var result = query.FirstOrDefault();
return result;
}
);
if(value.Value > 0) { // execution will be deferred until here
//
}
Lazy值=新的Lazy值(
() => {
变量查询=
来自context.tableX中的p
选择p.Id;
var result=query.FirstOrDefault();
返回结果;
}
);
如果(value.value>0){//执行将推迟到此处
//
}
所有返回单个不可枚举结果的标准Linq运算符将在声明查询的点立即执行。因此,FirstOrDefault
、Count
、Sum
和其他返回单个值的运算符将立即执行
这是一篇很好的MSDN文章当您对可枚举结果使用扩展方法时,它会变得急于加载。如果您不使用这些扩展方法,它将是延迟加载,并且在您通过linq结果枚举之前,您实际上无法获取值只有实体和
IEnumerable
被懒散加载。@Iti Tyagi-听起来不错就像您询问FirstOrDefault()是否将启动对GetEnumerator的调用一样。query.FirstOrDefault()是否会导致延迟加载或急切加载(即它是否会调用GetEnumerator)?我相信像query.ToList()这样的东西会强制执行一个急切的加载—FirstOrDefault()也会这样做吗?