我们有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说的:
异步查找具有给定主键值的实体。如果具有给定主键值的实体存在于上下文中,则将立即返回该实体,而不向存储区发出请求。否则,将向存储区请求具有给定主键值的实体,如果找到该实体,则将该实体附加到上下文并返回。如果在上下文或存储中找不到实体,则返回null。
所以我的问题是,如果我们给出的FirstOrDefault()
,SingleOrDefault()
和FindAsync()
的条件是主键,那么我们有什么实际的区别吗?
我认为第一次使用它们时总是访问db,,但是接下来的调用怎么办?。而且,EFCore可能会使用相同的上下文来获取FirstOrDefault()
和SingleOrDefault()
的值,就像它用于FindAsync()
、可能?一样。
发布于 2019-02-22 03:55:33
FindAsync
在许多脚手架代码中,可以使用FindAsync代替FirstOrDefaultAsync。
SingleOrDefaultAsync
获取更多数据并执行不必要的工作。如果有多个符合筛选器部件的实体,则抛出异常。
FirstOrDefaultAsync
如果有多个实体适合过滤器部分,则不会抛出。
发布于 2021-12-25 22:36:20
include
方法与FindAsync一起使用。https://stackoverflow.com/questions/54819705
复制相似问题