FirstOrDefaultAsync()和SingleOrDefaultAsync()与FindAsync()EFCore

Die*_*nio 6 c# linq ef-core-2.0

我们有3种不同的方法来得到EFCore单品他们FirstOrDefaultAsync()SingleOrDefaultAsync()(包括其版本有没有默认值返回,我们也有FindAsync(),也许更喜欢用同样的目的LastOrDefaultAsync()

     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);
Run Code Online (Sandbox Code Playgroud)

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

我认为FirstOrDefaultAsync()SingleOrDefaultAsync()总是访问数据库(对此不确定),FindAsync()这就是Microsoft文档所说的:

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

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

我认为第一次使用它们总是会命中数据库,但是下次调用该怎么办?。大概EFCore可以使用相同的情况下获得的值FirstOrDefault(),并SingleOrDefault()因为它的FindAsync()也许?

Joe*_*ips 25

查找异步

在大部分脚手架代码中,FindAsync 可用于代替 FirstOrDefaultAsync。

单一或默认异步

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

首先或默认异步

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

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


IBR*_*BRA 24

查找异步

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

第一或默认异步

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

SingleOrDefaultAsync

  • 接受表达。
  • 如果未找到匹配项,则返回默认值。
  • 如果找到多个匹配项,则会引发异常。