如何对数据库异步进行复杂的 LINQ 查询?
How to make a complicated LINQ query to DB Asynchronous?
我有一个同步项目,目前正在努力使其成为异步项目。
我有以下查询。它旨在获取特定购买项目的数据,然后获取该项目的最后购买日期和购买数量。
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(),”是否也可以通过某种方式异步化?
P.S。 Select returns IEnumerable 不是 IQueryable,因此我们不能立即使用“.FirstOrDefaultAsync()”。
当您执行基于 SQL 的 Linq(如 EF)查询时,整个查询 将转换为 SQL 然后执行。在您的示例中,FirstOrDefault
只是告诉查询生成器如何制定 SQL。它不是运行“主”查询中的单独查询。
因此,当您调用 ToListAsync
时, 整个查询 将转换为 SQL 并异步执行。也无需尝试将内部查询转换为异步。
我有一个同步项目,目前正在努力使其成为异步项目。
我有以下查询。它旨在获取特定购买项目的数据,然后获取该项目的最后购买日期和购买数量。
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(),”是否也可以通过某种方式异步化?
P.S。 Select returns IEnumerable 不是 IQueryable,因此我们不能立即使用“.FirstOrDefaultAsync()”。
当您执行基于 SQL 的 Linq(如 EF)查询时,整个查询 将转换为 SQL 然后执行。在您的示例中,FirstOrDefault
只是告诉查询生成器如何制定 SQL。它不是运行“主”查询中的单独查询。
因此,当您调用 ToListAsync
时, 整个查询 将转换为 SQL 并异步执行。也无需尝试将内部查询转换为异步。