我有一个时间的魔鬼发现的不同的方式来查询单个项目,以及何时使用每个比较。
有没有人有比较所有这些,或快速的解释,为什么你会用一个比其他的链接?是否有仍然更多的运营商,我不知道的?
谢谢。
下面是不同方法的概述:
我总是倾向于使用FirstOrDefault
。如果你真的想成为挑剔的性能,那么你应该在EF使用FirstOrDefault
。在幕后SingleOrDefault
采用自顶(2)查询,因为它需要检查是否有第二行符合条件,如果是的话,它抛出一个异常。基本上在SingleOrDefault
你是说你想,如果你的查询返回更多的则1个记录抛出异常。
这真的很简单:Single
返回单个项目,并抛出一个异常,如果没有或一个以上的项目。 First
将返回的第一个项目或在没有项目抛出。 FirstOrDefault
将返回第一项或返回默认值(这是null
以防给定类型为引用类型)当不存在项目。
这是API应该具有的行为。然而,需要注意的是底层的实现可能有不同的行为。虽然实体框架遵循这一点,像一个LLBLGEN O / RM还可以调用null
这是一个很奇怪的事情时,返回First
。这是由设计师IMO一个很奇怪的(固执)决定。
四个方法都有自己的位置;虽然你真的只有两种不同的操作。
该xxxxOrDefault()版本只是增加了对“我不想考虑一个空的结果集是一个特殊情况。”
在另一边,你可以把这些方法由核心逻辑是这样的:
对于一些细节表现,尤其是在第二种情况下,你可以看看这里:https://msdn.microsoft.com/en-us/data/hh949853.aspx?f=255&MSPPError=-2147217396#3
此外,在第一组中,你可以定义复杂的查询,但find()方法可以提供只能用于搜索实体键。
单()和的SingleOrDefault()通常用在唯一标识符例如ID,而第一个()或FirstOrDefault()通常用于那些可能有多个结果的查询,但你只想要“顶部1”。
单()或第()抛出,如果没有返回结果的SingleOrDefault()异常和FirstOrDefault()捕获异常,并返回null或默认(ResultDataType)。