LINQ - Where(Predicate).FirstOrDefault()与FirstOrDefault(Predicate)相同

时间:2014-10-21 16:03:25

标签: linq

我总是使用Where子句后跟FirstOrDefault子句的谓词编写LINQ查询。我开始在FirstOrDefault子句中看到带谓词的示例。

一个比另一个好吗?答案与EF(SQL)不同吗?

一个。使用Where子句

List<Product> products = GetProductList(); 

Product productWhere = products.Where(p => p.ProductID == 789).FirstOrDefault(); 

B中。没有条款

List<Product> products = GetProductList(); 

Product productNoWhere = products.FirstOrDefault(p => p.ProductID == 789); 

https://code.msdn.microsoft.com/LINQ-Element-Operators-0f3f12ce

1 个答案:

答案 0 :(得分:1)

因为Linq中的方法链被懒惰地评估,所以两者之间不应存在任何实质性差异。 Where.FirstOrDefault在获取值时将停止执行,就像FirstOrDefault(Predicate)一样。

换句话说,FirstOrDefault(或任何其他Linq运营商下游,就此问题)从Where接受一个 {{1>}项以进行评估,而不是一次完整列表(返回IEnumerable的Linq运算符的结果本质上是yield return

另见
Where.FirstOrDefault vs FirstOrDefault