Как восстановить запрос LINQ? (не работает на EF Core 3.0)

Я переместил свое приложение с dotnet 2.2 на 3.0. Я решил большие и маленькие проблемы, но запросы LINQ, которые я написал на уровне обслуживания, терпят неудачу.

Например, этот метод (и запрос linq) не работает:

public async Task<IList<PersonnelDto>> PersonnelChart(short year)
    {
        var result = await uow.Repository<Personnel>().Query()
            .Where(x => !x.IsOpen)
            .Include(i => i.CurrentMoney)
            .GroupBy(gp => new { id = gp.CurrencyType})
            .Select(s => new PersonnelChartDto
            {
                PersonnelId = s.Key.id,
                PersonnelCode = s.Key.code,
                PersonnelName = s.Key.name,
                PersonnelCount = s.Count(),
                SavingTotal = Math.Round(s.Sum(sm => sm.CurrentMoney
                   .Where(x => !x.IsDeleted)
                   .Select(ss => ss.SavingTotal)
                   .DefaultIfEmpty(0)
                   .Sum()), 2),                    
            })
            .ToListAsync();

        return result;
    }

При запуске этого метода EF Core выдает эту ошибку:

System.InvalidOperationException: обработка выражения LINQ «AsQueryable ((Необработанный параметр: sm) .CurrentMoney)» с помощью «NavigationExpandingExpressionVisitor» завершилась неудачно. Это может указывать на ошибку или ограничение в EF Core.

Итак, как я могу исправить эту ошибку?


person Samet Öz    schedule 03.12.2019    source источник
comment
Отвечает ли это на ваш вопрос? Запрос LINQ EF Core 2.2 не работает в EF Core 3.0   -  person phuzi    schedule 03.12.2019
comment
Я подозреваю, что это Math.Round доставляет вам проблемы. Без этого работает?   -  person DavidG    schedule 03.12.2019
comment
да, я проверял это раньше, но не поможет.   -  person Samet Öz    schedule 03.12.2019
comment
У вас есть дерево выражений. Исключение очень четко говорит о необработанном параметре sm. Вы можете использовать AsEnumerable () после GroupBy (). Это то, что ты хочешь? Это будет обрабатываться в памяти, а не в sql. Ограничение состоит в том, что EF не может преобразовать в SQL.   -  person panoskarajohn    schedule 03.12.2019
comment
Math.Round не переводится. DefaultIfEmpty с аргументом не работает github.com/aspnet/EntityFrameworkCore/issues/17783   -  person joakimriedel    schedule 09.12.2019
comment
Для меня даже DefaultIfEmpty без аргумента не работает - он компилируется в запрос с синтаксической ошибкой. Неэффективное решение: collection.Any() ? collection.Sum(ss => ss.SavingTotal) : 0   -  person wondra    schedule 09.06.2020