【问题标题】:GroupBy can't be translatedGroupBy 无法翻译
【发布时间】:2021-06-26 01:18:23
【问题描述】:

我正在尝试从我的数据库中删除重复项。我正在使用 Entity Framework Core 和 .NET 5。EF Core 无法通过以下方式实现我的组:

protected async Task RemoveDuplicates(CryptoInfoContext cryptoContext)
{
    try
    {
        var duplicates = cryptoContext.HistoricalCandles
            .GroupBy(x => new { x.StartDate, x.GranularitySeconds })
            .Where(x => x.Count() > 1)
            .ToList()
            .Select(x => x.FirstOrDefault())
            .ToList();

        cryptoContext.RemoveRange(duplicates);
        await cryptoContext.SaveChangesAsync();
    }
    catch(Exception ex)
    {
        Console.WriteLine(ex);
    }
}

我收到一个错误:

无法翻译给定的“GroupBy”模式。在“GroupBy”之前调用“AsEnumerable”以在客户端对其进行评估

我不想具体化我的所有行来删除重复项。 是否有 group by 的已知问题列表? 我该如何解决这个问题?

【问题讨论】:

  • 请寻找有关此错误的其他问题。它每周发布多次。
  • 谢谢,我现在明白了。我会尽快发布答案

标签: c# .net-core group-by entity-framework-core linq-to-entities


【解决方案1】:

我猜你的分组值是一个日期时间。在 group by 子句中只能使用标量值,因为 SQL 也不能按日期分组。 另请查看this git issue on more detailed explanationthis question on SQL details

至于解决方法 - 我没有尝试过,但您可能可以按时间字符串表示或刻度进行分组。

【讨论】:

  • 错了。 EF 核心 5 除了聚合子句外不支持 GroupBy,仅此而已。当然 SQL 可以按 DateTime 分组。
【解决方案2】:

感谢@GertArnold 为我指明了正确的方向。显然 EF Group by 只支持聚合查询。

正如article所指出的:

var ctx = new EntertainmentDbContext(conString);

var dataTask = ctx
            .Ratings
            .GroupBy(x => x.Source)
            .Select(x => new {Source = x.Key, Count = x.Count()})
            .OrderByDescending(x => x.Count)
            .ToListAsync();

var data = await dataTask;

这会像这样生成 SQL:

SELECT "r"."Source", COUNT(*) AS "Count"
FROM "Ratings" AS "r"
GROUP BY "r"."Source"
ORDER BY COUNT(*) DESC

注意:目前几乎没有其他方法可以使用,您甚至不能在 group by 之前应用 where。

另外还有一个开放的EF Core issue 请投票,以便他们真正解决这个问题,而不是推动另一个版本

【讨论】:

  • 我在使用 WhereGroupBy 时从来没有遇到过问题。问题在于查询,而不是 EF Core。事实上,我什至不会使用 EF Core 进行这样的查询,因为它不能使用像 ROW_NUMBER 这样的排名函数,这使得按日期选择“最新”记录更容易 lot,避免多次扫描和排序。 ORM 不是为报告查询而构建的,它们是为加载对象图而构建的。 LINQ 使事情变得更容易,但如果您拥有中等数量的数据或复杂性,最好创建一个报告视图(至少)并将 那些 结果映射到对象
  • 如果编写 SQL 查询比等效的 LINQ 查询更容易且运行速度更快,请使用 SQL 查询。
  • @PanagiotisKanavos,你的权利,我可能最终可以使用 EF 的原始 SQL 并利用其模型绑定(主要是因为我很懒,我需要快速推出一些东西,而不是使用 dapper )。回到项目后我会更新答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-25
  • 2021-06-13
  • 1970-01-01
  • 2014-07-14
  • 2022-10-20
  • 2021-04-13
相关资源
最近更新 更多