实体框架4 Single()vs First()vs FirstOrDefault()

时间:2010-08-14 22:10:36

标签: .net linq entity-framework entity-framework-4 linq-to-entities

我有一个时间的魔鬼找到查询单个项目的不同方法的比较,以及何时使用每个项目。

有没有人有一个比较所有这些的链接,或快速解释为什么你会使用一个而不是另一个?还有更多我不知道的运营商吗?

谢谢。

6 个答案:

答案 0 :(得分:188)

以下是不同方法的概述:

  • Find() - 当您想通过主键获取项目时。如果找不到项目,则返回null。它将在进入数据库之前查看上下文(正如Yaron在评论中指出的那样),如果你需要在相同的上下文存活时多次获得相同的实体,这可能是一个重要的效率因素。

    < / LI>
  • Single() - 当您希望查询返回一个项目时。如果查询没有返回一个项目,则会抛出异常。

  • SingleOrDefault() - 当您希望查询返回零个或一个项目时(即您不确定是否存在具有给定键的项目)。如果查询未返回零个或一个项,则会抛出异常。

  • First() - 当您希望查询返回一个或多个项目但您只想访问代码中的第一个项目时(在此处查询中排序可能很重要)。如果查询未返回至少一个项目,则会抛出异常。

  • FirstOrDefault() - 当您希望查询返回零个或多个项目但您只想访问代码中的第一个项目时(即您不确定是否存在具有给定键的项目)

答案 1 :(得分:19)

我总是倾向于使用FirstOrDefault。如果你真的想要对性能挑剔,那么你应该在EF中使用FirstOrDefault。在封面SingleOrDefault下使用查询中的top(2),因为它需要检查是否存在与条件匹配的第二行,如果匹配,则抛出异常。基本上在SingleOrDefault中,如果查询返回的记录超过1条,则表示要抛出异常。

答案 2 :(得分:15)

这非常简单:Single返回单个项目,如果没有或多个项目则抛出异常。 First将返回第一个项目或在没有项目时抛出。如果没有项目,FirstOrDefault将返回第一个项目或返回默认值(如果给定类型是引用类型,则为null

这是API应该具有的行为。但请注意,底层实现可能有不同的行为。虽然实体框架遵循这一点,但像LLBLGen这样的O / RM也可以在调用null时返回First,这是一件非常奇怪的事情。这是设计师IMO的一个非常奇怪(和顽固)的决定。

答案 3 :(得分:8)

这四种方法各有所长;虽然你真的只有两种不同的操作。

  • 首先 - 期待包含多个项目的结果集,给我该集合中的第一个项目。
  • 单身 - 期待一个结果,给我那个项目。

xxxxOrDefault()版本只是添加“我不想将空结果集视为异常情况。”

答案 4 :(得分:3)

另一方面,您可以通过核心逻辑划分这些方法,如下所示:

  • 方法将直接查询数据库 Single(),SingleOrDefault(),First(),FirstOrDefault()
  • 方法将在对数据库发出查询之前在缓存中执行搜索 Find()

对于某些性能细节,特别是在第二种情况下,您可以在这里查看: https://msdn.microsoft.com/en-us/data/hh949853.aspx?f=255&MSPPError=-2147217396#3

此外,在第一组中,您可以定义复杂查询,但使用 Find()方法,您只能为搜索提供实体密钥。

答案 5 :(得分:0)

Single() SingleOrDefault()通常用于唯一标识符,例如ID,而 First() FirstOrDefault ()通常用于可能包含多个结果但您只想要“Top 1”的查询。

如果没有返回任何结果,则单个()第一个()会抛出异常, SingleOrDefault() FirstOrDefault( )捕获异常并返回null或default(ResultDataType)。