EF 3.x 中最简单的分组依据失败,并显示“不支持客户端分组依据”

2024-01-06

目前正在使用 EF Core 版本 3.1.1 进行测试。

当我搜索时,我找到了对此问题的引用,但我没有看到任何关于为什么会发生这种情况的明确答案,以及它是否是一个将被修复的错误或是否是预期的行为。这就像看起来一样简单 - BatchRequest 表/实体有一个名为 BatchId 的整数列/属性:

var batchRequestGroups = context.BatchRequests.GroupBy(br => br.BatchId).ToList();

当我运行此命令时,我收到 System.InvalidOperationException,“不支持客户端 GroupBy”。

因此,根据我在网上找到的解释,除了顶级投影之外,EF Core 3.x 似乎不再允许客户端 GroupBy。

From https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.0/writing-changes#linq-queries-are-no-longer-evaluated-on-the-客户 https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.0/breaking-changes#linq-queries-are-no-longer-evaluated-on-the-client:

旧行为

在 3.0 之前,当 EF Core 无法转换属于 对 SQL 或参数的查询,它会自动评估 客户端上的表达式。默认情况下,客户评价为 潜在昂贵的表达式只会触发警告。

新行为

从 3.0 开始,EF Core 只允许顶层表达式 要评估的投影(查询中的最后一个 Select() 调用) 客户端。当查询的任何其他部分中的表达式不能 转换为 SQL 或参数时,会引发异常。

这是否意味着在以前的版本中,ALLGroupBy 子句在客户端上进行评估?

另外,为什么我的示例中的 GroupBy 不能在 SQL 中计算?我的示例的 GroupBy 为何不是顶级投影?

再次,我的主要问题:这是一个错误还是预期的行为?


从 EF 3.0 开始,客户端对查询的评估被视为错误,这与之前的版本被视为警告不同。

这是否意味着在以前的版本中,所有 GroupBy 子句都在客户端上求值?

不。并非所有的 group by 语句都在客户端进行评估。这取决于 EF 核心是否能够将 LINQ 转换为支持的 SQL 语句。

另外,为什么我的示例中的 GroupBy 不能在 SQL 中计算?我的示例的 GroupBy 为何不是顶级投影?

我的猜测是您的实体包含其他关系以及 EF 核心加载和按指定属性分组,而这在 SQL 中无法完成。

再次,我的主要问题:这是一个错误还是预期的行为?

显然这不是一个错误。这是预期的行为。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

EF 3.x 中最简单的分组依据失败,并显示“不支持客户端分组依据” 的相关文章

随机推荐