Как использовать GroupBy более одного раза в EF Core

Когда я пытаюсь "сгруппировать" более одного раза, я получаю ошибку исключения.

Чтобы изолировать ошибку, я написал небольшой фрагмент кода, чтобы повторить это исключение. Он не намерен достигать чего-либо практического, кроме как использовать группу более одного раза и заставить ее работать. Это мой тестовый код:

private IQueryable<Inventory> InventoryMiddleWare1(DateTime start, DateTime end)
    {
        var query = _context.Inventory.Where(r => r.InventoryDate>= start && r.InventoryDate<= end)
        .GroupBy(g => new {
            LocationCode = g.LocationCode,
            SKU= g.SKU,
            InventoryDate= g.InventoryDate
        })
        .Select(g => new
        {
            LocationCode = g.Key.LocationCode,
            SKU= g.Key.SKU,
            InventoryDate= g.Key.InventoryDate,
            Units= g.Max(r => r.Units)
        })
        .GroupBy(g => g.InventoryDate).Select(g=> new
        {
            InventoryDate= g.Key.Value,
            Units2= g.Sum(r=>r.Units)
        }).Select(r=> new Inventory()
        {
            InventoryDate= r.InventoryDate,
            Units= r.Units2
        });

        return query;
    }

Первое сообщение, которое я получаю, - это предупреждение:

Application> warn: The LINQ expression 'Max()' could not be translated and will be evaluated locally.

Затем он падает и выдает следующее исключение:

Application> fail: Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware[0]
Application>       An unhandled exception has occurred while executing the request
Application> System.ArgumentException: Value does not fall within the expected range.

Есть какие-нибудь подсказки?

1 ответ

Нашел свой вопрос, хотя у меня возникла та же проблема - я не дошел до основной причины, но у меня есть обходной путь... поэтому может быть идея не пометить это как "Принятый ответ"!

Кажется, что-то тебя останавливает GroupBy как это больше (я столкнулся с этой проблемой при переносе старой базы кода, в которой он работал)

Я обошел это, выполнив запрос к списку, используя ToList() после первого. Конечно, это может повлиять на производительность, но я сказал, что это обходной путь! Для примера в вопросе мой обходной путь будет:

private IQueryable<Inventory> InventoryMiddleWare1(DateTime start, DateTime end)
    {
        var query = _context.Inventory.Where(r => r.InventoryDate>= start && r.InventoryDate<= end)
        .GroupBy(g => new {
            LocationCode = g.LocationCode,
            SKU= g.SKU,
            InventoryDate= g.InventoryDate
        })
        .Select(g => new
        {
            LocationCode = g.Key.LocationCode,
            SKU= g.Key.SKU,
            InventoryDate= g.Key.InventoryDate,
            Units= g.Max(r => r.Units)
        })
        .ToList()
        .GroupBy(g => g.InventoryDate).Select(g=> new
        {
            InventoryDate= g.Key.Value,
            Units2= g.Sum(r=>r.Units)
        }).Select(r=> new Inventory()
        {
            InventoryDate= r.InventoryDate,
            Units= r.Units2
        });

        return query;
    }

Я постараюсь продолжить, когда у меня будет время, но я подозреваю, что это происходит, потому что кто-то умнее меня понял, что GroupBy должно всегда хватать, если вы правильно сформулировали запрос. Было бы неплохо, если бы исключение имело смысл!

Я получил то же исключение ArgumentException, что и Артуро, при попытке использовать несколько предложений GroupBy в одном запросе. Несколько похожее исключение, описанное в следующей проблеме, которая должна быть исправлена ​​в EF Core 3.0:https://github.com/aspnet/EntityFrameworkCore/issues/12805

Я попытался обновить свой проект до предварительной версии EF Core 3.0, чтобы посмотреть, решило ли это мою проблему. Однако мне также пришлось обновить предварительную версию.NET Core 3.0, что вызвало некоторые проблемы со сборкой / запуском, которые у меня не было достаточно времени для решения.

Другие вопросы по тегам