LINQ Single vs First

问题描述

如果您期望一条记录,那么在您的代码中明确说明总是好的。

我知道其他人已经写过你为什么使用其中一个,但我想我会说明为什么你不应该使用一个,当你 的是另一个时。

注意:在我的代码中,我通常会使用FirstOrDefault()andSingleOrDefault()但这是一个不同的问题。

Customers以使用复合键 ( ID, ) 以不同语言存储的表为例Lang

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

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

由于您的意图是返回 Single Customeruse 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()时,使用运算符是否更有效?First() *

有区别吗?