【发布时间】:2022-01-17 01:07:24
【问题描述】:
我有一个同步项目,我目前正在努力使其异步。
我有以下问题。它旨在获取特定购买项目的数据,然后获取该项目的最后购买日期和购买数量。
private IQueryable<ItemOverviewDto> GetBaseQuery(string userId)
{
var query = this.Context.Items
.Where(x => x.UserId == userId)
.Select(x => new ItemOverviewDto()
{
Id = x.Id,
Name = x.Name,
ReplenishmentPeriod = x.ReplenishmentPeriod,
NextReplenishmentDate = x.NextReplenishmentDate,
LastReplenishmentDate = x.Purchases
.OrderByDescending(y => y.ReplenishmentDate)
.Select(m => (DateTime?)m.ReplenishmentDate)
.FirstOrDefault(),
LastReplenishmentQuantity = x.Purchases
.OrderByDescending(y => y.ReplenishmentDate)
.Select(m => (int?)m.Quantity)
.FirstOrDefault(),
});
return query;
}
这里是repo。
我构建查询并稍后实现它。当我实现它时 - 我使用 ToListAsync();但我想知道这部分 - “.Select(m => (int?)m.Quantity).FirstOrDefault()”也可以以某种方式异步吗?
附: Select 返回一个 IEnumerable 而不是 IQueryable,因此我们不能立即使用“.FirstOrDefaultAsync()”。
【问题讨论】:
-
我很困惑 - 如果您使用
ToListAsync调用它,那么 整个查询 将异步执行,为什么您需要FirstOrDefault部分异步?您是否遇到实际性能问题,或者只是假设将其更改为异步会提供更好的性能? -
IQueryable<ItemOverviewDto>只是一个查询。它的运行方式取决于您是尝试直接枚举它还是使用像ToListAsync()这样的异步方法。完全没有理由尝试将FirstOrDefault更改为FirstOrDefaultAsync,因为该函数被转换为TOP 1子句,而不是自己执行 -
@DStanley,Panagiotis Kanavos,感谢您的 cmets。我认为 FirstOrDefault 可能会在部分查询中导致一些同步操作。但是由于 ToListAsync() 根据您的 cmets,整个查询将异步运行。 DStanley,既然你是第一个发帖的——如果你愿意,你可以给一个官方的答案,这样我就可以选择了。
标签: c# linq asynchronous