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。
单一或默认异步
获取更多数据并执行不必要的工作。如果有多个实体适合过滤器部件,则抛出异常。
首先或默认异步
如果有多个实体适合过滤器部件,则不会抛出。