如何在EF Core中多次使用GroupBy

时间:2018-06-13 22:35:44

标签: entity-framework-core-2.1

当我尝试"分组"不止一次,我收到异常错误。

为了隔离错误,我写了一小段代码来复制这个异常。除了不止一次使用group并使其工作之外,它并不打算实现任何实际操作。这是我的测试代码:

parent

我收到的第一条消息是警告:

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.

任何线索?

2 个答案:

答案 0 :(得分:1)

在遇到相同问题的同时找到了您的问题-我还没有找到根本原因,但是确实有一种解决方法...所以 不是 将其标记为“可接受的答案”!

似乎有些东西阻止您像这样 那样进一步{@ {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; } 就足够了。如果抛出的异常是有道理的,那就太好了!

答案 1 :(得分:0)

当尝试在同一查询中使用多个GroupBy子句时,我得到了与Arturo相同的ArgumentException。在以下问题中描述的某种类似异常,应该在EF Core 3.0中修复: https://github.com/aspnet/EntityFrameworkCore/issues/12805

我尝试将项目更新为EF Core 3.0预览版,以查看是否解决了我的问题。但是,我还必须更新到.NET Core 3.0预览版,这会导致一些构建/运行问题,而我没有足够的时间来解决该问题。