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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.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
FirstorDefault()导致延迟加载或急于加载linq到sql_Linq_C# 4.0_Linq To Sql - Fatal编程技术网

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

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

当与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
   }
感谢您的热切期待

仔细想想,它只返回一个普通的
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()也会这样做吗?