LINQ:为什么使用... Take(1).SingleOrDefault()?

时间:2018-07-17 11:57:57

标签: c# linq

我目前正在检查要维护的一些代码。

我见过几次

.Take(1).SingleOrDefault()

为什么要使用它而不是简单地

.First() or .FirstOrDefault() 

(我不确定如果结果集为空,.Take(1)是否会抛出异常,哪一个恕我直言会导致这两种.First ...方法之间的区别?)

2 个答案:

答案 0 :(得分:2)

我们不可能确切知道您正在使用的任何LINQ提供程序的内部实现。它们的执行方式各不相同。在这种情况下,有些可能会表现更好,而其他情况可能会表现欠佳。无论哪种方式,您都应该获得相同的结果。

在这种情况下,我们不可能读懂别人的想法来确定他们为什么会这样做。

话虽如此,如果您想更深入地了解它是一个SQL提供程序,则可以查看它生成的SQL并比较这两种情况。

答案 1 :(得分:1)

主要反对意见是.Take(1).SingleOrDefault()违背了SingleOrDefault的目的,即LINQ查询返回多个元素时抛出异常。

为了说明这一点,在对Sql Server后端运行LINQ时,Single(OrDefault)将转换为SELECT TOP (2) ...,以确定是否实际上存在一条记录。在Take(1)之前将永远不会返回一个以上的记录,因此尽管代码似乎需要它,但“ multiple result”异常不会发生。对于担心返回两个对象而不是一个对象的人,此代码看起来像(过早的)优化。

因此,您的问题“您为什么要使用它?”的答案。是:完全没有理由这样做。完全有理由这样做。