【发布时间】:2021-03-17 10:56:32
【问题描述】:
我将 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。
【问题讨论】:
-
不,它根本不起作用。它实际上作为 SQL 毫无意义——你会按什么分组,表名? EF Core 1 受到如此限制,它甚至无法处理
GroupBy,因此所有数据都加载到客户端并在那里分组,而索引没有任何好处。客户端评估是一种丑陋的权宜之计,将被删除。 EF 核心 2.2。 可以处理 GroupBy 但仍允许客户端评估并发出警告。如果您检查了应用程序的日志,您会看到客户端评估警告。 EF Core 3.0 终于禁用了客户端评估 -
换句话说,代码已经有一个严重的性能和逻辑错误,会发出警告,同时在分组之前将整个表加载到内存中。 EF Core 2.2 警告它,而 EF Core 3 最终禁用它
-
"数据已经在内存中" 所以不是 EF Core (LINQ to Entities),而是标准的内存中 (LINQ to Objects)
GroupBy操作?如果是,可能您已使用无跟踪查询加载了对象? -
@IvanStoev 你是对的,没有跟踪
-
@IvanStoev 是的,这是 LINQ to Objects,它曾经在 2.2 版本中工作,没有跟踪,因为它读取数据而不修改。
标签: entity-framework-core linq-to-objects ef-core-3.1 ef-core-3.0 ef-core-5.0