当我确定查询将返回 单个记录*Single()时,使用运算符是否更有效?First() *
Single()
First()
有区别吗?
我知道其他人已经写过你为什么使用其中一个,但我想我会说明为什么你不应该使用一个,当你 指 的是另一个时。
注意:在我的代码中,我通常会使用FirstOrDefault()andSingleOrDefault()但这是一个不同的问题。
FirstOrDefault()
SingleOrDefault()
Customers以使用复合键 ( ID, ) 以不同语言存储的表为例Lang:
Customers
ID
Lang
DBContext db = new DBContext(); Customer customer = db.Customers.Where( c=> c.ID == 5 ).First();
上面的代码引入了一个可能的逻辑错误(难以追踪)。它将返回多条记录(假设您有多种语言的客户记录),但它总是只返回第一个……这有时可能会起作用……但其他人则不行。这是不可预测的。
由于您的意图是返回 Single Customeruse Single();
Customer
以下将引发异常(在这种情况下这是您想要的):
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 条记录时使用将帮助您避免逻辑错误。