首页 > 解决方案 > LINQ-to-Objects - 不能按对象分组

问题描述

我将 efcore 2.2 升级到 5 并且 simple group by 不起作用,
数据已经在内存中,看看:

List<IGrouping<Categories, Businesses>> businessesByCategory = 
    location.Businesses
            .GroupBy(x => x.Category.Parent ?? x.Category)
            .ToList();

在 Ef Core 2.2 中它运行良好,业务按其类别分组,现在它什么也不做。

如果我尝试按 id 分组,它可以工作:

List<IGrouping<int, Businesses>> businessesByCategory = location.Businesses
    .GroupBy(x => x.Category.ParentId ?? x.CategoryId)
   .ToList();

但我需要 Category 实体,这样我只能得到类别 ID。

标签: entity-framework-corelinq-to-objectsef-core-3.1ef-core-3.0ef-core-5.0

解决方案


该问题是由 EF Core 3.0 无跟踪查询行为重大更改引起的 -无跟踪查询不再执行身份解析。因此,现在Category具有相同的对象Id是不同的实例,因此 LINQ to Objects 使用的默认相等比较器GroupBy将它们视为不同的键,因此根本不分组。

EF Core 5.0 恢复了 2.x 行为 -使用身份解析的无跟踪查询,但您必须使用该AsNoTrackingWithIdentityResolution方法代替AsNoTracking(). 或者QueryTrackingBehavior.NoTrackingWithIdentityResolution如果设置默认值ChangeTracker.QueryTrackingBehavior


推荐阅读