LINQ:

当我确定查询将返回a single record时,使用Single()运算符代替First()更有效吗?

有什么不同吗?

推荐答案

如果您希望看到一条记录,那么在代码中明确显示总是好的.

我知道其他人已经写了为什么你使用其中一个,但我想我应该说明为什么你不应该使用一个,当你使用另一个.

Note: In my code, I will typically use 100 and 101 but that's a different question.

例如,一个使用复合键(IDLang)以不同语言存储Customers的表:

DBContext db = new DBContext();
Customer customer = db.Customers.Where( c=> c.ID == 5 ).First();

上面的代码引入了一个可能的逻辑错误(难以跟踪).它将返回多个记录(假设您有多个语言的客户记录),但它总是只返回第一个记录...这有时可能有用...但其他人则不然.这是不可预测的.

由于您意图是返回单个Customer,因此使用Single()

下面将抛出一个异常(在本例中,这是您想要的):

DBContext db = new DBContext();
Customer customer = db.Customers.Where( c=> c.ID == 5 ).Single();

然后,你简单地打自己的额头,然后对自己说…哎呀!我忘了语言领域了!以下是正确的版本:

DBContext db = new DBContext();
Customer customer = db.Customers.Where( c=> c.ID == 5 && c.Lang == "en" ).Single();

First()在以下情况下很有用:

DBContext db = new DBContext();
NewsItem newsitem = db.NewsItems.OrderByDescending( n => n.AddedDate ).First();

它将返回一个对象,因为您正在使用排序,所以它将是返回的最新记录.

当您觉得Single()应该显式地始终返回1条记录时,使用Single()将帮助您避免逻辑错误.

.net相关问答推荐

.NET MAUI垂直扫描视图(tiktok幻灯片等)

如何处理以用户为中心的CSP现时值?(uc-lock.bundle.js)

通过交互服务器渲染模式和流渲染的组合防止双重渲染

在 .NET 7 项目上设置 Sentry 时遇到问题

如何查询 DOTNET_CLI_TELEMETRY_OPTOUT 是否永久设置为 TRUE?

cmd 冻结中的 dotnet 命令.怎么了?

将 Span 传递到函数时出现 F# 错误

将日期时间转换为日期格式 dd/mm/yyyy

无法加载文件或程序集 不支持操作. (来自 HRESULT 的异常:0x80131515)

DbContext 丢弃更改而不释放

在生产中使用实体框架(代码优先)迁移

将屏幕捕获为位图

为什么 ?: 会导致转换错误,而 if-else 不会?

无法加载文件或程序集'System.ComponentModel.Annotations,版本 = 4.1.0.0

什么是 Hashtable 的通用版本?

无法将文件 *.mdf 作为数据库附加

如何在 WebBrowser 控件中注入 Javascript?

/langversion 的错误选项6无效;必须是 ISO-1、ISO-2、3、4、5 或默认值

如何使用 AutoMapper .ForMember?

无法添加对 dll 的引用