gpt4 book ai didi

c# - FirstOrDefaultAsync() & SingleOrDefaultAsync() 与 FindAsync() EFCore

转载 作者:太空狗 更新时间:2023-10-29 21:42:41 32 4
gpt4 key购买 nike

我们有 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 文档中的内容:

Asynchronously finds an entity with the given primary key values. Ifan entity with the given primary key values exists in the context,then it is returned immediately without making a request to the store.Otherwise, a request is made to the store for an entity with the givenprimary key values and this entity, if found, is attached to thecontext and returned. If no entity is found in the context or thestore, then null is returned.

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

我的想法是,第一次使用它们时总是会触发数据库,​​但是接下来的调用呢?。可能 EFCore 可以使用与 FindAsync() 相同的上下文来获取 FirstOrDefault()SingleOrDefault() 的值,< strong>也许?。

最佳答案

查找异步

In much of the scaffolded code, FindAsync can be used in place of FirstOrDefaultAsync.

单一或默认异步

fetches more data and does unnecessary work. throws an exception if there's more than one entity that fits the filter part.

FirstOrDefaultAsync

doesn't throw if there's more than one entity that fits the filter part.

https://learn.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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com