考虑IEnumerable扩展方法SingleOrDefault()和FirstOrDefault()
MSDN文档SingleOrDefault:
返回序列中唯一的元素,如果序列为空则返回默认值;如果序列中有多个元素,此方法将引发异常。
而来自MSDN的FirstOrDefault(假设在使用OrderBy()或orderbydescent()或根本不使用时),
返回序列的第一个元素
考虑一些示例查询,并不总是清楚何时使用这两个方法:
var someCust = db.Customers
.SingleOrDefault(c=>c.ID == 5); //unlikely(?) to be more than one, but technically COULD BE
var bobbyCust = db.Customers
.FirstOrDefault(c=>c.FirstName == "Bobby"); //clearly could be one or many, so use First?
var latestCust = db.Customers
.OrderByDescending(x=> x.CreatedOn)
.FirstOrDefault();//Single or First, or does it matter?
问题
当你决定在LINQ查询中使用SingleOrDefault()和FirstOrDefault()时,你遵循或建议什么约定?
所以,正如我现在所理解的,SingleOrDefault将是很好的,如果你正在查询数据,保证是唯一的,即强制的DB约束,如主键。
或者是否有更好的方法来查询主键。
假设我的TableAcc有
AccountNumber - Primary Key, integer
AccountName
AccountOpenedDate
AccountIsActive
etc.
和我想查询一个AccountNumber 987654,我使用
var data = datacontext.TableAcc.FirstOrDefault(obj => obj.AccountNumber == 987654);
所以,正如我现在所理解的,SingleOrDefault将是很好的,如果你正在查询数据,保证是唯一的,即强制的DB约束,如主键。
或者是否有更好的方法来查询主键。
假设我的TableAcc有
AccountNumber - Primary Key, integer
AccountName
AccountOpenedDate
AccountIsActive
etc.
和我想查询一个AccountNumber 987654,我使用
var data = datacontext.TableAcc.FirstOrDefault(obj => obj.AccountNumber == 987654);
如果结果集返回0条记录:
SingleOrDefault返回类型的默认值(例如int的默认值为0)
FirstOrDefault返回类型的默认值
如果结果集返回1条记录:
SingleOrDefault返回该记录
FirstOrDefault返回该记录
如果你的结果集返回很多记录:
SingleOrDefault抛出异常
FirstOrDefault返回第一条记录
结论:
如果希望在结果集包含许多记录时抛出异常,请使用SingleOrDefault。
如果无论结果集包含什么,您总是想要1条记录,请使用FirstOrDefault