Table of Contents
1 问题描述
您在LINQ中决定使用SingleOrDefault()和FirstOrDefault()时遵循或建议哪些约定?
2 SingleOrDefault与FirstOrDefault介绍
LINQ一般查询到的结果是IEnumerable<T>集合类型,想要取出单一元素,下面是几个常用的方法对比:
方法 | 序列为null时 | 序列不包含任何元素时 | 序列只包含一个元素时 | 序列包含多个 元素时 |
---|---|---|---|---|
Single | 引发异常 | 引发异常 | 返回该元素 | 引发异常 |
SingleOrDefault | 引发异常 | 返回default(TSourse) | 返回该元素 | 引发异常 |
First | 引发异常 | 引发异常 | 返回该元素 | 返回第一个元素 |
FirstOrDefaulty | 引发异常 | 返回default(TSourse) | 返回该元素 | 返回第一个元素 |
一个非常重要的区别是:如果在具有多个元素的序列上使用SingleOrDefault,它将抛出异常。
3 观点总结
实际开发中很少有人希望出现异常,所以大部分人只要是取一个元素直接使用FirstOrDefault。
观点:无论何时使用SingleOrDefault,都清楚的说明查询最多只能产生一个结果。另一方面, 当使用FirstOrDefault,查询可以返回任何数量的结果,但是您申明的只需要第一个结果。 语义非常不同,使用适当的语言,这取决于预期的结果,提高了可读性。
如果希望抛出异常,如果结果集包含许多记录,请使用SingleOrDefault。 如果始终想要1条记录,无论结果集包含什么,请使用 FirstOrDefault。
个人看法,在逻辑上确定是0或者1时使用SingleOrfault是有价值的。如果有更多的话,这是错误的情况,抛出异常是有帮助的。 可以纠正由其他地方粗心引起的问题,避免更大的问题,提高可读性和稳定性。但可能也会让不是自己的Bug,定位到自己的头上。