我们有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);

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

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



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

我认为第一次使用它们总是会打到数据库,但是下次调用该怎么办? 。也许EFCore可以使用与FirstOrDefault()相同的上下文来获取SingleOrDefault()FindAsync()的值?

最佳答案

FindAsync



SingleOrDefaultAsync



FirstOrDefaultAsync



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

关于c# - FirstOrDefaultAsync()和SingleOrDefaultAsync()与FindAsync()EFCore,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54819705/

10-12 00:54