entity-framework-core - 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。
解决方案
该问题是由 EF Core 3.0 无跟踪查询行为重大更改引起的 -无跟踪查询不再执行身份解析。因此,现在Category
具有相同的对象Id
是不同的实例,因此 LINQ to Objects 使用的默认相等比较器GroupBy
将它们视为不同的键,因此根本不分组。
EF Core 5.0 恢复了 2.x 行为 -使用身份解析的无跟踪查询,但您必须使用该AsNoTrackingWithIdentityResolution
方法代替AsNoTracking()
. 或者QueryTrackingBehavior.NoTrackingWithIdentityResolution
如果设置默认值ChangeTracker.QueryTrackingBehavior
。
推荐阅读
- django - 不应有 max_length 的 Django max_length
- android - FCM 从非默认 FCM 服务获取注册令牌
- python - (python tkinter)带有类的页面,变量传递给其他页面,不能用作标签:PY_VAR0
- python - 如何在 discord.py 中创建一个自定义异常/错误处理程序类来处理特定于命令的错误?
- reactjs - 如何将 React 函数组件属性设置为跨 JSX 元素类型?
- node.js - 用户需要在签署文件之前登录
- javascript - 制作篮球比赛。我做错了什么?
- python - 为什么在这里 C++ 比 Python 快得多?
- java - 从字符串中删除空格、数字和特殊字符
- javascript - JavaScript 和 CSS 中的“平滑滚动”有什么区别?