我目前正在检查要维护的一些代码。
我见过几次
.Take(1).SingleOrDefault()
为什么要使用它而不是简单地
.First() or .FirstOrDefault()
(我不确定如果结果集为空,.Take(1)是否会抛出异常,哪一个恕我直言会导致这两种.First ...方法之间的区别?)
答案 0 :(得分:2)
我们不可能确切知道您正在使用的任何LINQ提供程序的内部实现。它们的执行方式各不相同。在这种情况下,有些可能会表现更好,而其他情况可能会表现欠佳。无论哪种方式,您都应该获得相同的结果。
在这种情况下,我们不可能读懂别人的想法来确定他们为什么会这样做。
话虽如此,如果您想更深入地了解它是一个SQL提供程序,则可以查看它生成的SQL并比较这两种情况。
答案 1 :(得分:1)
主要反对意见是.Take(1).SingleOrDefault()
违背了SingleOrDefault
的目的,即LINQ查询返回多个元素时抛出异常。
为了说明这一点,在对Sql Server后端运行LINQ时,Single(OrDefault)
将转换为SELECT TOP (2) ...
,以确定是否实际上存在一条记录。在Take(1)
之前将永远不会返回一个以上的记录,因此尽管代码似乎需要它,但“ multiple result”异常不会发生。对于担心返回两个对象而不是一个对象的人,此代码看起来像(过早的)优化。
因此,您的问题“您为什么要使用它?”的答案。是:完全没有理由这样做。完全有理由不这样做。