Почему ядро ​​EF не может переводить счетчик? - PullRequest
0 голосов
/ 09 мая 2020

Я хочу запросить несколько агрегированных значений из базы данных самым быстрым способом в ядре EF, я нашел это Entity Framework с несколькими счетчиками с помощью одного запроса и попробовал это

        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, но очень не люблю их поддерживать. Или, возможно, попробую для этого места dapper.

PS. Таким образом создается запрос, переданный методу

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

PPS. Используется EF Core 3.1.1

...