Answers:
以下是不同方法的概述:
Find()-当您想通过主键获取项目时。如果找不到项目,它将返回null。它会在进入数据库之前先检查上下文(正如Yaron在评论中指出的),如果您需要在同一个上下文还活着的情况下多次获取相同的实体,这可能是一个重要的效率因素。
Single()-当您期望查询完全返回一个项目时。如果查询未完全返回一项,则将引发异常。
SingleOrDefault()-当您期望查询返回零或一项(即,不确定是否存在具有给定键的项)时。如果查询未返回零或一项,则将引发异常。
First()-当您希望查询返回一个或多个项目,但您只想访问代码中的第一个项目时(此处的查询顺序很重要)。如果查询未返回至少一项,则将引发异常。
FirstOrDefault()-当您期望查询返回零个或多个项目,但您只想访问代码中的第一个项目时(即,您不确定是否存在具有给定键的项目)
Sales.OrderByDescending(s => s.TotalValue).First();
Single
或者SingleOrDefault
将查询2条记录(限制2),而First
或者FirstOrDefault
将查询1 条记录(限制1)。
我总是倾向于使用FirstOrDefault
。如果您真的想对性能保持挑剔,则应FirstOrDefault
在EF中使用。在幕后SingleOrDefault
使用了查询的顶部(2),因为它需要检查是否有第二行与条件匹配,如果匹配,则抛出异常。基本上,SingleOrDefault
您的意思是如果查询返回的记录多于1条,则要引发异常。
FirstOrDefault
和之间的性能差异SingleOrDefault
很大?我会说在大多数情况下这是过早的优化。
Single()
或者SingleOrDefault()
当我退货时,应该只存在一个。我这样做的原因是通过进行写得不好的查询来发现错误,这些错误返回的错误数量超过应有的失败。至少在我看来,这将有助于使系统中的数据保持一致。当然,这比较慢,但是我想它不会慢很多,我愿意为此付出代价。
这非常简单:Single
返回单个项目,如果没有一个或多个项目,则抛出异常。First
将返回第一个项目或没有项目时抛出。当没有项目时,FirstOrDefault
将返回第一项或返回默认值(null
在给定类型为引用类型的情况下)。
这是API应该具有的行为。但是请注意,基础实现可能具有不同的行为。尽管Entity Framework遵循了这一规定,但null
调用时也可能返回像LLBLGen这样的O / RM First
,这是非常奇怪的事情。这是设计师IMO做出的非常奇怪的决定。
Single
明确表示您只希望结果包含一个元素。
另一方面,您可以按核心逻辑划分这些方法,如下所示:
有关某些性能的详细信息,尤其是在第二种情况下,您可以在此处查看:https : //msdn.microsoft.com/zh-cn/data/hh949853.aspx?f=255&MSPPError=-2147217396#3
另外,在第一组中,您可以定义复杂的查询,但是使用Find()方法,您可以仅提供用于搜索的实体关键字。