- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在摆弄 LinqToSQL 和 LINQPad,我注意到 SingleOrDefault() 没有对生成的 SQL 进行任何过滤或限制(我几乎期望与 Take(1) 等效)。
因此,假设您想保护自己免受大量意外返回的影响,以下代码片段有用还是坏主意?
// SingleType is my LinqToSQL generated type
// Singles is the table that contains many SingleType's
// context is my datacontext
public SingleType getSingle(int id)
{
var query = from s in context.Singles where s.ID == id select s;
var result = query.Take(2).SingleOrDefault();
return result;
}
与我本来会做的正常方式相反(注意没有 .Take(2) )
public SingleType getSingle(int id)
{
var query = from s in Singles where s.ID == id select s;
var result = query.SingleOrDefault();
return result;
}
我想通了 Take(2),我仍然可以获得 SingleOrDefault() 的功能,还有一个额外的好处,那就是永远不必担心意外返回 {n} 行,但我不确定它是否值得除非我一直期望我的查询不小心返回 {n} 行。
那么,这值得吗?有害吗?是否有任何我没有看到的优点/缺点?
编辑:
SELECT [t0].[blah], (...)
FROM [dbo].[Single] AS [t0]
WHERE [t0].[ID] = @p0
SELECT TOP 2 [t0].[blah], (...)
FROM [dbo].[Single] AS [t0]
WHERE [t0].[ID] = @p0
此外,当我谈到 SingleOrDefault 的功能时,我特别希望它在返回 2 个或更多时抛出异常,这就是我执行“Take(2)”的原因。不同之处在于,如果没有 .Take(2),它将从数据库返回 {n} 行,而实际上它只需要返回 2 行(刚好足以使其抛出)。
最佳答案
Single
更像是一种获取查询的单个元素的便捷方法,而不是一种限制结果数量的方法。通过使用 Single
,你实际上是在说“我知道这个查询只能有一个项目,所以把它给我”,就像在做 someArray[0]
当你知道只有一个元素时。 SingleOrDefault
添加了在处理长度为 0 的序列时返回 null
而不是抛出异常的能力。您不应该使用 Single
或 SingleOrDefault
查询可能返回超过 1 个结果:将抛出 InvalidOperationException
。
如果查询中的ID
是表的主键,或者是UNIQUE
列,数据库会确保结果集只包含1行或者none with no需要一个 TOP
子句。
但是,如果您在非唯一/非键列上进行选择,并且想要第一个结果或最后一个结果(请注意,除非您还引入 OrderBy
,否则这些没有任何意义)那么您可以使用 First
或 Last
(它们都有 OrDefault
对应项)来获取您想要的 SQL:
var query = from s in context.Singles
where s.Id == id
orderby s.someOtherColumn
select s;
var item = query.FirstOrDefault();
附带说明一下,如果您确实要查询单个元素,则可以节省一些输入:
var query = from s in context.Singles where s.Id == id select s;
var item = query.SingleOrDefault();
可以变成:
var item = context.Singles.SingleOrDefault(s => s.Id == id);
关于c# - 这种 SingleOrDefault() 优化是值得的还是过度/有害?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/830222/
我正在生成代码,其中我恰好将 n 个单词从一个内存位置复制到另一个非重叠内存位置。 n 是静态已知的。 目前,我发出大量加载指令,然后是大量存储指令,但我怀疑从 n 的某个值开始,调用 memcpy会
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 4 年前。 Improve this ques
用例如下: 我有一张 map ,其中将插入一些键/值。 该程序将查询该 map ,但是在第一个查询之后,我可以保证该 map 将完全不会被修改。 因为查询的结果完全是输入的函数,所以在查询方法上放置属
Helo 伙计们,我尝试使用 Refs 并在他的内部提供 this.setState 但它给出: Maximum update depth exceeded. This can happen when
在检查事件时,使用带有 switch 或 if 的代码块是很常见的事情。如果变得简单,它可以是干净的代码,但似乎仍然有比需要更多的行,并且可以使用 lambda 进行简化。 用 if 阻止: if(a
Amazon 最近宣布在其 RDS 产品线中支持 Oracle: http://aws.amazon.com/rds/oracle/ 我想知道是否有人使用过它,或者是否有令人信服的理由将我的数据从 M
我是一名优秀的程序员,十分优秀!