为什么EF核心无法翻译计数?

时间:2020-05-09 16:15:27

标签: ef-core-3.0

我想以EF核心方式以最快的速度从数据库查询多个聚合值,我找到了Entity Framework multiple counts with a single query并尝试了

        public Task<VouchersUsageMetrics> BuildVouchersUsageMetrics(
            IQueryable<Voucher> vouchers,
            VoucherSetting voucherSetting,
            CancellationToken cancellationToken)
        {
            var startOfToday = this.dateTimeProvider.GetStartOfDay(this.dateTimeProvider.Now);
            return vouchers
                .Select(it => SelectExpressions.GetVoucherStatus.Invoke(it, startOfToday))
                .GroupBy(
                    it => 1,
                    (groupId, groupItems) =>
                        new VouchersUsageMetrics(
                            voucherSetting.TotalPrepaidCount,
                            voucherSetting.MaxAvailablePostpaidCount)
                        {
                            Expired = groupItems.Count(it => it == (long)VoucherStatusEnum.Expired),
                            Assigned = groupItems.Count(it => it == (long)VoucherStatusEnum.Assigned),
                            Requested = groupItems.Count(it => it == (long)VoucherStatusEnum.Requested),
                        })
                .FirstOrDefaultAsync(cancellationToken);
        }

但是我遇到下一个错误:

System.InvalidOperationException:LINQ表达式 '(GroupByShaperExpression:KeySelector:(1), ElementSelector:(ProjectionBindingExpression:EmptyProjectionMember)) .Count(it =>(long)it == 21)'无法翻译。要么以可以翻译的形式重写查询...

我尝试过

  1. 用常量替换SelectExpressions
  2. 已尝试删除第一个Select
  3. 尝试查询表而不是查询表,例如this.context.Vouchers

,但始终具有相同的错误。我不知道为什么,:)害怕如果无法正常工作,必须使用SQL Virtual Views,但是真的不喜欢支持它们。或可能会尝试在这个地方使用精致的包装。

PS。这是如何构造传递给该方法的可查询对象

            this.context.Vouchers
                .AsNoTracking()
                .AsExpandableEFCore()
                .Where(it => it.AgencyID == 1);

PPS。使用了EF Core 3.1.1

0 个答案:

没有答案