LINQ - GroupBy год / месяц - PullRequest
       15

LINQ - GroupBy год / месяц

0 голосов
/ 19 сентября 2019

Я пытаюсь заполнить данные графика общей суммой (суммой) за последние четыре месяца, и визуально это будет выглядеть так:

enter image description here

Я до сих пор пытался сгруппировать данные по годам и месяцам, но я не уверен, что это правильный подход, потому что это не работает ..

Вот код:

 var testQUERY = await _context.Calculation
             .AsNoTracking()
             .Where(x => (x.PaymentDate != null && x.PaymentDate > DateTime.UtcNow.AddMonths(-4)))
            .GroupBy(x => new { x.PaymentDate.Value.Year, x.PaymentDate.Value.Month}).ToListAsync();

Вот моя дата платежа: enter image description here

И мне интересно, как я могу сгруппировать только по месяцам ... Ошибка, с которой я столкнулся, следующая:

Ошибка, сгенерированная для предупреждения 'Microsoft.EntityFrameworkCore.Query.QueryClientEvaluationWarning: выражение LINQ' GroupBy (new <> f__AnonymousType0`2 (Year = Convert ([p] .PaymentDate, DateTime) .Year, Month = Convert)([p] .PaymentDate, DateTime) .Month), [p]) 'не удалось перевести и будет оцениваться локально.'.Это исключение можно подавить или зарегистрировать, передав идентификатор события 'RelationalEventId.QueryClientEvaluationWarning' методу 'ConfigureWarnings' в 'DbContext.OnConfiguring' или 'AddDbContext'.

PS Если я лучше подумаю, потому что я 'используя

x.PaymentDate != null && x.PaymentDate > DateTime.UtcNow.AddMonths(-4)

Мне не нужен новый анонимный тип, в который я также включил год ... но я забыл, что пытаюсь сгруппировать по столбцам, которых не существует ..?

1 Ответ

1 голос
/ 19 сентября 2019

Попробуйте использовать это.Смотрите комментарии для возможных исправлений.

var testQUERY = await _context.Calculation
         .AsNoTracking()
         .Where(x => x.PaymentDate != null)
         .Select(x => new { PaymentDate = x.PaymentDate.Value, Row=x }) // pre-select non-null payment date
         .Where(x => x.PaymentDate > DateTime.UtcNow.AddMonths(-4)) // this should go after the grouping, as it might include from just part of the month
         .GroupBy(x => new { x.PaymentDate.Year, x.PaymentDate.Month})
         .Select(grp=> new { grp.Key.Year, grp.Key.Month, Count = grp.Count()) // flatten group and calculate aggregates
         .ToListAsync();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...