Напишите основной оператор, который рассчитывает на преформу - PullRequest
1 голос
/ 13 марта 2019

Почему .net core 2.2. если это

 var posBlagajnik = rampa.Doc.Where(x => x.SmjenaId == smjena.Id && (x.DocTipNavigation.IsRacun || x.DocTipNavigation.IsStorno)).GroupBy(x => x.User.ImeIprezime)
            .Select(x => new PosBlagajnik() { ime = x.Key, brojRacuna = x.Count(), inkas = x.Sum(f => f.Iznos.Value) }).ToList();

Преформа в памяти, но не в SQL.
Мой контекст предупреждает меня

Не удалось перевести выражение LINQ «Count ()», и оно будет оценивается на месте.

Я хочу отправить в SQL что-то вроде этого.

select
                    AspNetUsers.ImeIprezime
                    ,COUNt(*) as brojRacuna
                    ,sum(iznos) as inkas
                from doc
                inner join AspNetUsers on doc.user_id=AspNetUsers.id
                inner join dokumenti on doc.doc_tip=dokumenti.id
                where doc.smjena_id=79 and (dokumenti.isRacun = 1 or dokumenti.isStorno=1)

                group by  AspNetUsers.ImeIprezime

Редактировать после комментариев

Благодаря помощи @IvanStoev, мне удалось написать ef, который предшествует SQL-агрегатам.

Вот новый вопрос по исследованию

Когда я изменил свой ef-запрос на

var posBlagajnik = rampa.Doc
                    .Where(x => x.SmjenaId == smjena.Id && (x.DocTipNavigation.IsRacun || x.DocTipNavigation.IsStorno))
                    .GroupBy(x => x.User.ImeIprezime)
                    .Select(x => new PosBlagajnik() { ime = x.Key, brojRacuna = x.Count(),
                        inkas = x.Sum(f => f.Iznos) 
                    }).ToList();

Ef начать выполнение агрегирования sql.

Изначально я использовал x.Sum(f => f.Iznos.Value), потому что f.Iznos имеет значение Nullable (десятичное число?), А inkas на PosBlagajnik не имеет значения Nullable. Используя .Value я конвертировал decima? в десятичный. Похоже, это сбивает с толку ef для локальной обработки всех запросов.

Это нормально для ef или это какая-то ошибка?

1 Ответ

2 голосов
/ 13 марта 2019

На самом деле проблема заключается в выражении

x.Sum(f => f.Iznos.Value)

В настоящее время EF Core переводит только агрегированные методы SQL с простыми селекторами доступа к свойствам.

Эту проблему можно решить с помощью оператора ?? снаружи агрегатная функция:

x.Sum(f => f.Iznos) ?? 0
...