First,FirstOrDefault,Single,SingleOrDefault的区别
操作符 | 如果源序列是空的 | 源序列只包含一个元素 | 源序列包含多个元素 |
First | 抛异常 | 返回该元素 | 返回第一个元素 |
FirstOrDefault | 返回default(TSource) | 返回该元素 | 返回第一个元素 |
Last | 抛异常 | 返回该元素 | 返回最后一个元素 |
LastOrDefault | 返回default(TSource) | 返回该元素 | 返回最后一个元素 |
Single | 抛异常 | 返回该元素 | 抛异常 |
SingleOrDefault | 返回default(TSource) | 返回该元素 | 抛异常 |
我们拿事实说话:使用SQL Server Profilter进行SQL监视
在EF或者NH中查询单条数据的时候
1、First()扩展方法得到的是这个:
2、FirstOrDefault()扩展方法和FirstOrDefault()得到的监视是一样的,它俩的区别只是FirstOrDefault有个默认的值而已
3、Single()扩展方法得到的监视图:
那为什么Single()取得是TOP2而不是TOP1呢?这是一个聪明的做法,因为Single()取的是唯一的数据,取TOP2的话,假如表中有两条一模一样的数据,取得话就会得到两条数据,这样就会报错,那就说明了一个问题:你的表数据可能存在问题。
3、SingleOrDefault() 得到的监视图和Single()是一样的,也进行重复判断,如果查询集合为空,则返回该类型的默认值,类似FirstOrDefault();
我一般使用SingleOrDefault()进行登录操作,这样操作比较好一些
4、对于Last()和LastOrDefault(),在EF中并不支持这样的写法,虽然这样写编译能够通过,但是调试的时候回报错的,可以使用OrderBy和First()/FirstOrDefault()结合得到类似效果,
为什么这样的写法不支持呢?因为EF不知道你要根据哪个字段进行倒序排序,所以这样的写法是错误的
作者:王家大人
出处:http://wms01.cnblogs.com
限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。
声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。