实体框架4单()与第()VS FirstOrDefault()

问题描述 投票:105回答:6

我有一个时间的魔鬼发现的不同的方式来查询单个项目,以及何时使用每个比较。

有没有人有比较所有这些,或快速的解释,为什么你会用一个比其他的链接?是否有仍然更多的运营商,我不知道的?

谢谢。

.net linq entity-framework entity-framework-4 linq-to-entities
6个回答
193
投票

下面是不同方法的概述:

  • 查找() - 当你想获得通过主键的项目。这将返回null,如果它不能找到一个项目。它看起来的背景下,才去数据库(如亚龙在评论中指出),这是一个重要的效率系数,如果你需要多次获得相同的实体,而同样情况下是活的。
  • 单() - 当你想到只有一个项目被查询返回的。这将抛出一个异常,如果该查询返回的结果不是一个项目。
  • 的SingleOrDefault() - 当你希望通过一个查询返回零个或一个项目(即你是不知道,如果给定的关键项目存在)。这将抛出一个异常,如果查询不返回零个或一个项目。
  • 首先() - 当你想到一个或多个项目通过查询返回的,但你只需要访问你的代码中的第一项(排序可能是在查询中重要的在这里)。这将抛出一个异常,如果查询不返回至少一个项目。
  • FirstOrDefault() - 当你希望通过一个查询返回零个或多个项目,但你只需要访问的第一个项目在你的代码(即你是不知道,如果给定的关键项目存在)

19
投票

我总是倾向于使用FirstOrDefault。如果你真的想成为挑剔的性能,那么你应该在EF使用FirstOrDefault。在幕后SingleOrDefault采用自顶(2)查询,因为它需要检查是否有第二行符合条件,如果是的话,它抛出一个异常。基本上在SingleOrDefault你是说你想,如果你的查询返回更多的则1个记录抛出异常。


15
投票

这真的很简单:Single返回单个项目,并抛出一个异常,如果没有或一个以上的项目。 First将返回的第一个项目或在没有项目抛出。 FirstOrDefault将返回第一项或返回默认值(这是null以防给定类型为引用类型)当不存在项目。

这是API应该具有的行为。然而,需要注意的是底层的实现可能有不同的行为。虽然实体框架遵循这一点,像一个LLBLGEN O / RM还可以调用null这是一个很奇怪的事情时,返回First。这是由设计师IMO一个很奇怪的(固执)决定。


8
投票

四个方法都有自己的位置;虽然你真的只有两种不同的操作。

  • 首先 - 期待一个包含多个项目的结果集,给我在这集的第一个项目。
  • 单 - 期待一个结果回来,给我的项目。

该xxxxOrDefault()版本只是增加了对“我不想考虑一个空的结果集是一个特殊情况。”


3
投票

在另一边,你可以把这些方法由核心逻辑是这样的:

  • 方法会直接查询数据库:单()的SingleOrDefault(),一(),FirstOrDefault()
  • 方法甚至会发出查询针对数据库之前执行缓存搜索:查找()

对于一些细节表现,尤其是在第二种情况下,你可以看看这里:https://msdn.microsoft.com/en-us/data/hh949853.aspx?f=255&MSPPError=-2147217396#3

此外,在第一组中,你可以定义复杂的查询,但find()方法可以提供只能用于搜索实体键。


0
投票

单()和的SingleOrDefault()通常用在唯一标识符例如ID,而第一个()或FirstOrDefault()通常用于那些可能有多个结果的查询,但你只想要“顶部1”。

单()或第()抛出,如果没有返回结果的SingleOrDefault()异常和FirstOrDefault()捕获异常,并返回null或默认(ResultDataType)。

© www.soinside.com 2019 - 2024. All rights reserved.