【问题标题】:How to make a complicated LINQ query to DB Asynchronous?如何对数据库异步进行复杂的 LINQ 查询?
【发布时间】: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&lt;ItemOverviewDto&gt; 只是一个查询。它的运行方式取决于您是尝试直接枚举它还是使用像ToListAsync() 这样的异步方法。完全没有理由尝试将FirstOrDefault 更改为FirstOrDefaultAsync,因为该函数被转换为TOP 1 子句,而不是自己执行
  • @DStanley,Panagiotis Kanavos,感谢您的 cmets。我认为 FirstOrDefault 可能会在部分查询中导致一些同步操作。但是由于 ToListAsync() 根据您的 cmets,整个查询将异步运行。 DStanley,既然你是第一个发帖的——如果你愿意,你可以给一个官方的答案,这样我就可以选择了。

标签: c# linq asynchronous


【解决方案1】:

当您执行基于 SQL 的 Linq(如 EF)查询时,整个查询会转换为 SQL,然后执行。在您的示例中,FirstOrDefault 只是告诉查询生成器如何制定 SQL。它没有在“主”查询中运行单独的查询。

所以当您调用ToListAsync 时,整个查询 被转换为 SQL 并异步执行。也无需尝试将内部查询转换为异步。

【讨论】:

    猜你喜欢
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 2015-04-28
    • 2018-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多