11

与 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

4 回答 4

12

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

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

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

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
    //
}
于 2013-05-31T14:56:41.723 回答
11

所有标准的 Linq 运算符,它们返回单个的、不可枚举的结果,都会在查询声明处立即执行。因此,、、FirstOrDefaultCount其他Sum返回单个值的运算符会立即执行。

这是一篇不错的 MSDN 文章按执行方式分类标准查询运算符

于 2013-05-31T14:59:02.860 回答
2

It becomes Eager loading when you use extension methods on the enumerable result.If you don't use those extension methods it will be Lazy loading and you can't actually fetch the values until you enumerate through the linq result

于 2014-09-01T10:50:53.543 回答
2

迫不及待的加载!

如果您考虑一下,它只会返回一个普通int的 - anint不可能代表“一种方式去获得一个int”。(这Lazy<int>就是为了……)

于 2013-05-31T14:50:21.027 回答