Entity Framework 4 Single()vs First()vs FirstOrDefault()

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

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

谢谢。

以下是不同方法的概述:

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

  • Single() – 当你期望一个查询返回一个项目。 如果查询不完全返回一个项目,这将引发exception。

  • SingleOrDefault() – 当您期望一个查询返回零个或一个项目(即,您不确定具有给定关键字的项目是否存在)。 如果查询不返回零或一个项目,这将引发exception。

  • First() – 当您希望查询返回一个或多个项目时,只想访问代码中的第一个项目(在此查询中sorting可能很重要)。 如果查询不返回至less一个项目,这将引发exception。

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

我总是倾向于使用FirstOrDefault。 如果你真的想挑战性能,那么你应该使用EF中的FirstOrDefault。 在SingleOrDefault的覆盖下,在查询中使用top(2),因为它需要检查是否有第二行符合条件,如果是,它会抛出一个exception。 基本上在SingleOrDefault中,你是说如果你的查询返回的logging多于1条,你就会抛出一个exception。

这真的很简单: Single返回一个项目,并抛出一个例外,如果有没有或多个项目。 First会返回第一个项目或抛出没有项目时。 FirstOrDefault将返回第一个项目,或者在没有项目时返回默认值(在给定types是引用types的情况下为null )。

这是API应该具有的行为。 但请注意,底层的实现可能会有不同的行为。 虽然entity framework服从这一点,但是当调用First ,像LLBLGen这样的O / RM也可以返回null ,这是非常奇怪的事情。 这是devise者IMO的一个非常奇怪(和固执)的决定。

四种方法各有其优势。 虽然你只有两个不同的操作。

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

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

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

  • 方法将直接查询数据库Single(),SingleOrDefault(),First(),FirstOrDefault()
  • 即使对数据库发出查询,方法也会在caching中执行searchFind()

有关性能的详细信息,尤其是在第二种情况下,您可以在这里查看: https : //msdn.microsoft.com/en-us/data/hh949853.aspx?f=255&MSPPError=-2147217396#3

另外,在第一组中,您可以定义复杂的查询,但使用Find()方法,您只能提供用于search的实体关键字。

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

如果没有返回结果, Single()First()会抛出exception, SingleOrDefault()FirstOrDefault()会捕获exception并返回null或默认值(ResultDataType)。