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,定位到自己的头上。