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

Nat*_*lai 0 c# entity-framework entity-framework-core

使用Find()和从上下文查询数据时有什么不同Single()。两者都返回被请求的实体。

我在 Microsoft 上发现的一些示例正在使用Single,SingleOrDefault变体来查询实体。一些使用Find方法。

使用其中之一时是否有任何“性能”优势?

AAA*_*ddd 5

尽管它们看起来相同,但在某些基本方面却大不相同

简而言之,Find首先在上下文的本地缓存中搜索。如果未找到匹配项,则它会向数据库发送查询。

文档是你的朋友

DbSet.Find 方法

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

Queryable.SingleOrDefault 方法

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

Queryable.FirstOrDefault 方法

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

马马虎虎

查询和查找实体

DbSet 上的 Find 方法使用主键值来尝试查找由上下文跟踪的实体。如果在上下文中未找到实体,则将向数据库发送查询以在那里找到实体。如果在上下文或数据库中找不到实体,则返回 Null。

Find 在两个重要方面不同于使用查询:

  • 只有在上下文中找不到具有给定键的实体时,才会进行到数据库的往返。
  • Find 将返回处于已添加状态的实体。也就是说,Find 将返回已添加到上下文但尚未保存到数据库的实体。

更新

这是否意味着如果实体已经被跟踪(通过延迟加载),那么在尝试再次查询时 Find 实际上会有更好的性能优势?

是的,它会有更好的性能