实体框架4单()与第()VS FirstOrDefault()
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实体框架4单()与第()VS FirstOrDefault()相关的知识,希望对你有一定的参考价值。
我有一个时间的魔鬼发现的不同的方式来查询单个项目,以及何时使用每个比较。
有没有人有比较所有这些,或快速的解释,为什么你会用一个比其他的链接?是否有仍然更多的运营商,我不知道的?
谢谢。
下面是不同方法的概述:
- 查找() - 当你想获得通过主键的项目。这将返回null,如果它不能找到一个项目。它看起来的背景下,才去数据库(如亚龙在评论中指出),这是一个重要的效率系数,如果你需要多次获得相同的实体,而同样情况下是活的。
- 单() - 当你想到只有一个项目被查询返回的。这将抛出一个异常,如果该查询返回的结果不是一个项目。
- 的SingleOrDefault() - 当你希望通过一个查询返回零个或一个项目(即你是不知道,如果给定的关键项目存在)。这将抛出一个异常,如果查询不返回零个或一个项目。
- 首先() - 当你想到一个或多个项目通过查询返回的,但你只需要访问你的代码中的第一项(排序可能是在查询中重要的在这里)。这将抛出一个异常,如果查询不返回至少一个项目。
- FirstOrDefault() - 当你希望通过一个查询返回零个或多个项目,但你只需要访问的第一个项目在你的代码(即你是不知道,如果给定的关键项目存在)
我总是倾向于使用FirstOrDefault
。如果你真的想成为挑剔的性能,那么你应该在EF使用FirstOrDefault
。在幕后SingleOrDefault
采用自顶(2)查询,因为它需要检查是否有第二行符合条件,如果是的话,它抛出一个异常。基本上在SingleOrDefault
你是说你想,如果你的查询返回更多的则1个记录抛出异常。
这真的很简单:Single
返回单个项目,并抛出一个异常,如果没有或一个以上的项目。 First
将返回的第一个项目或在没有项目抛出。 FirstOrDefault
将返回第一项或返回默认值(这是null
以防给定类型为引用类型)当不存在项目。
这是API应该具有的行为。然而,需要注意的是底层的实现可能有不同的行为。虽然实体框架遵循这一点,像一个LLBLGEN O / RM还可以调用null
这是一个很奇怪的事情时,返回First
。这是由设计师IMO一个很奇怪的(固执)决定。
四个方法都有自己的位置;虽然你真的只有两种不同的操作。
- 首先 - 期待一个包含多个项目的结果集,给我在这集的第一个项目。
- 单 - 期待一个结果回来,给我的项目。
该xxxxOrDefault()版本只是增加了对“我不想考虑一个空的结果集是一个特殊情况。”
在另一边,你可以把这些方法由核心逻辑是这样的:
- 方法会直接查询数据库:单()的SingleOrDefault(),一(),FirstOrDefault()
- 方法甚至会发出查询针对数据库之前执行缓存搜索:查找()
对于一些细节表现,尤其是在第二种情况下,你可以看看这里:https://msdn.microsoft.com/en-us/data/hh949853.aspx?f=255&MSPPError=-2147217396#3
此外,在第一组中,你可以定义复杂的查询,但find()方法可以提供只能用于搜索实体键。
单()和的SingleOrDefault()通常用在唯一标识符例如ID,而第一个()或FirstOrDefault()通常用于那些可能有多个结果的查询,但你只想要“顶部1”。
单()或第()抛出,如果没有返回结果的SingleOrDefault()异常和FirstOrDefault()捕获异常,并返回null或默认(ResultDataType)。
以上是关于实体框架4单()与第()VS FirstOrDefault()的主要内容,如果未能解决你的问题,请参考以下文章
DbContext 代码生成策略在实体框架 5 和 VS 2012 中失败