DbContext.Find()和DbContext.SingleOrDefault()在Entity Framework Core中的区别

3

使用Find()Single()从上下文查询数据的不同之处在哪里?两者都返回所请求的实体。

我在微软上找到的一些示例使用SingleSingleOrDefault变体来查询实体。有些使用Find方法。

在使用其中一种方法时是否有任何“性能”优势?


你忽略了参数,这些参数(部分地)可以回答你的问题:Find()只接受主键,而Single()的变体则需要一个谓词。通常,该谓词将与主键匹配,并且性能应该是相等的。但是Single()总是会有一点额外的开销,并且容易出错。 - bommelding
实际上,还有更多的差异。https://msdn.microsoft.com/zh-cn/library/gg696418(v=vs.113).aspx - 如果答案可以从已加载的对象中获取,那么查询不应该访问数据库。 - TomTom
@bommelding 这是否意味着Find方法只接受“ID”(主键)作为参数?所以实际上Single方法更具动态性和更好的使用。 - Natthapol Vanasrivilai
1个回答

7
尽管它们看起来相同,但在某些基本方面它们非常不同。
简而言之,Find 从上下文的本地缓存中开始搜索。如果没有找到匹配项,则向数据库发送查询。 文档是你的朋友 DbSet.Find 方法

使用给定的主键值查找实体。如果在上下文中存在具有给定主键值的实体,则立即返回该实体,而无需向存储发出请求。否则,将向存储请求具有给定主键值的实体,并将找到的此实体附加到上下文并返回。如果在上下文或存储中未找到实体,则返回 null。

Queryable.SingleOrDefault 方法

返回序列中的单个特定元素,如果找不到这样的元素,则返回默认值。

Queryable.FirstOrDefault 方法

返回序列中的第一个元素,如果没有找到元素,则返回默认值。

更多信息

查询和查找实体

DbSet的Find方法使用主键值来查找上下文中跟踪的实体。如果在上下文中未找到该实体,则会向数据库发送查询以查找该实体。如果在上下文或数据库中未找到该实体,则返回Null。 Find与使用查询的方式有两个重要区别: 1.仅当未在上下文中找到具有给定键的实体时,才会进行往返于数据库的操作。 2.Find将返回处于Added状态的实体。也就是说,Find将返回已添加到上下文但尚未保存到数据库中的实体。 更新 这是否意味着,如果实体已通过惰性加载被跟踪,那么在尝试再次查询时,Find实际上会具有更好的性能优势?
是的,它将具有更好的性能。

这是否意味着如果实体已经通过延迟加载进行了跟踪,那么当再次尝试查询时,Find方法实际上会具有更好的性能优势? - Natthapol Vanasrivilai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接