c# – 这个SingleOrDefault()优化是否值得,还是过度有害?

c# – 这个SingleOrDefault()优化是否值得,还是过度有害?,第1张

概述我正在搞乱 LinqToSQL和LINQPad,我注意到SingleOrDefault()没有对生成的SQL进行任何过滤或限制(我几乎期望相当于Take(1)). 因此,假设您想要保护自己免受大量意外退回,以下代码段是否有用或者是一个坏主意? // SingleType is my LinqToSQL generated type // Singles is the table that con 我正在搞乱 LinqTosql和liNQPad,我注意到SingleOrDefault()没有对生成的sql进行任何过滤或限制(我几乎期望相当于Take(1)).

因此,假设您想要保护自己免受大量意外退回,以下代码段是否有用或者是一个坏主意?

// SingleType is my linqTosql generated type // Singles is the table that contains many SingleType's// context is my datacontextpublic 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}行.

那么,这值得吗?有害吗?有没有我没见过的专业人士/骗子?

编辑:

sql生成没有Take(2)

SELECT [t0].[blah],(...) FROM [dbo].[Single] AS [t0]WHERE [t0].[ID] = @p0

使用Take生成的sql(2)

SELECT top 2 [t0].[blah],(...) FROM [dbo].[Single] AS [t0]WHERE [t0].[ID] = @p0

此外,当我谈到SingleOrDefault的功能时,我特别希望在返回2个或更多时抛出异常,这就是为什么我在做“Take(2)”.不同之处在于,如果没有.Take(2),它将返回数据库中的{n}行,当它真的只需要返回2时(刚好足以让它抛出).

解决方法 单个是获取查询的单个元素的便捷方法,而不是限制结果数量的方法.通过使用Single,你实际上是在说“我知道这个查询只能有一个项目,所以就把它交给我”,就像在做someArray [0]时知道只有一个元素一样. SingleOrDefault添加了返回null的能力,而不是在处理长度为0的序列时抛出异常.您不应该对可能返回多于1个结果的查询使用Single或SingleOrDefault:将抛出InvalIDOperationException.

如果查询中的ID是表的主键或UNIQUE列,则数据库将确保结果集包含1行或不包含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()优化是否值得,还是过度/有害?全部内容,希望文章能够帮你解决c# – 这个SingleOrDefault()优化是否值得,还是过度/有害?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1215380.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存