如何对数据库异步进行复杂的 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 并异步执行。也无需尝试将内部查询转换为异步。