C# 为什么要使用…Take(1).SingleOrDefault()?

C# 为什么要使用…Take(1).SingleOrDefault()?,c#,linq,C#,Linq,我目前正在检查一些我将要维护的代码 我看到过几次 .Take(1).SingleOrDefault() 你为什么要用它而不是简单的 .First() or .FirstOrDefault() (我不确定如果结果集为空,.Take(1)是否会抛出一个exeption,这会对这两个.First…方法产生影响?我们不可能确切地知道您可能使用的任何LINQ提供程序的内部实现。他们做这件事的方式各不相同。在这种情况下,有些可能表现得更好,而另一些可能表现得更差。你应该得到同样的结果 我们不可能读懂某

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

我看到过几次

.Take(1).SingleOrDefault()
你为什么要用它而不是简单的

.First() or .FirstOrDefault() 

(我不确定如果结果集为空,.Take(1)是否会抛出一个exeption,这会对这两个.First…方法产生影响?

我们不可能确切地知道您可能使用的任何LINQ提供程序的内部实现。他们做这件事的方式各不相同。在这种情况下,有些可能表现得更好,而另一些可能表现得更差。你应该得到同样的结果

我们不可能读懂某人的心思来确定他们为什么会这样做


话虽如此,如果您想深入研究,并且它是一个SQL提供程序,您可以看到它生成了什么SQL并比较这两种情况。

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

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


所以你的问题“你为什么要用它?”的答案是:绝对没有理由这样做。不这样做的原因只有一个。

这取决于许多因素。。。例如,如果要启用数据分页,可以调用:
datacontext.Skip(currentpage*10).Take(10)
。对于第一个,ORM肯定会将
Take(1)
转换为
TOP(1)
,然后解析返回的第一行的结果。无法保证它会将
First()/FirstOrDefault()
转换为
TOP(1)
。如果有多个,则Single将抛出。Take不会抛出空列表测试很简单
var test=new list()。Take(1)。这两者基本上是等价的。选择一个(最好是
First或default
,因为它更清晰、更简洁、速度更快)。@xanatos,我不是先说的。在
.Take(1).SingleOrDefault()
中,使用了
Take
来确保single不会抛出。然后我回答问题的最后一句话。op公司担心,采取空将是一个问题。当只有空掷时。代码审查显示出一个错误理解,op也有一个错误理解。我只想回答这些问题。
selecttop(2)
在mysql中甚至都不是一件事。不知道你为什么会假设提供者是used@JoePhillips我可以在这里列出所有的语法选择(比如MySql中的
限制数量
),但这有点离题了。任何合适的查询提供程序都会确保Single(OrDefault)的语义得到正确实现。你为什么认为它是合适的呢?我使用的LLBLGen版本产生了非常糟糕的SQL。这种东西的低效实现并不少见。假设它是SQL,也可能不是。它可以是任何东西。那么至少,如果这是为了避免糟糕的SQL(或其他)生成,我希望
Take(2)
。否则使用
单一…
是没有意义的。我同意你的观点,你很可能是正确的,但这是基于对我们没有的信息的假设