首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >FirstOrDefaultAsync() & SingleOrDefaultAsync() vs FindAsync() EFCore

FirstOrDefaultAsync() & SingleOrDefaultAsync() vs FindAsync() EFCore
EN

Stack Overflow用户
提问于 2019-02-22 03:37:42
回答 2查看 20.3K关注 0票数 40

我们有3种不同的方法从EFCore中获取单个项--它们是FirstOrDefaultAsync()SingleOrDefaultAsync() (包括其不返回默认值的版本,还有FindAsync(),可能还有更多的方法具有相同的用途,比如LastOrDefaultAsync()

代码语言:javascript
运行
复制
var findItem = await dbContext.TodoItems
    .FindAsync(request.Id)
    .ConfigureAwait(false);

var firstItem = await dbContext.TodoItems
    .FirstOrDefaultAsync(i => i.Id == request.Id)
    .ConfigureAwait(false);

var singleItem = await dbContext.TodoItems
    .SingleOrDefaultAsync(i => i.Id == request.Id)
    .ConfigureAwait(false);

我想知道它们之间的区别。到目前为止,我所知道的是,我们使用FirstOrDefaultAsync()来获得第一个给定的条件(通常是因为我们知道一个以上的项可以满足条件),另一方面,我们使用SingleOrDefaultAsync(),因为我们知道只有一个可能的匹配项可以找到,而FindAsync()可以获得一个给定的主键的项。

我认为FirstOrDefaultAsync() & SingleOrDefaultAsync()总是访问数据库(不确定这一点),而FindAsync() --这是Microsoft说的:

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

所以我的问题是,如果我们给出的FirstOrDefault()SingleOrDefault()FindAsync()的条件是主键,那么我们有什么实际的区别吗?

我认为第一次使用它们时总是访问db,,但是接下来的调用怎么办?。而且,EFCore可能会使用相同的上下文来获取FirstOrDefault()SingleOrDefault()的值,就像它用于FindAsync()可能?一样。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-22 03:55:33

FindAsync

在许多脚手架代码中,可以使用FindAsync代替FirstOrDefaultAsync。

SingleOrDefaultAsync

获取更多数据并执行不必要的工作。如果有多个符合筛选器部件的实体,则抛出异常。

FirstOrDefaultAsync

如果有多个实体适合过滤器部分,则不会抛出。

https://learn.microsoft.com/en-us/aspnet/core/data/ef-rp/crud?view=aspnetcore-2.2#singleordefaultasync-vs-firstordefaultasync

票数 40
EN

Stack Overflow用户

发布于 2021-12-25 22:36:20

FindAsync

  • 接受主键
  • 为查找具有主键的实体而优化的方法是,如果实体被跟踪,则返回该实体而不访问数据库。
  • 不能将include方法与FindAsync一起使用。
  • 如果没有找到匹配项,则返回默认值。

FirstOrDefaultAsync

  • 接受表达。
  • 如果需要相关实体,则比FindAsync更好的选择。
  • 如果没有找到匹配项,则返回默认值。

SingleOrDefaultAsync

  • 接受表达。
  • 如果没有找到匹配项,则返回默认值。
  • 如果找到多个匹配项,则引发异常。
票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54819705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档