GroupBy无法翻译

GroupBy can't be translated

我正在尝试从我的数据库中删除重复项。我正在使用 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);
    }
}

我遇到一个错误:

Unable to translate the given 'GroupBy' pattern. Call 'AsEnumerable' before 'GroupBy' to evaluate it client-side

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

我猜你的分组值是 DateTime。 group by 子句中只能使用标量值,因为 SQL 也不能按日期分组。 另请参阅 this git issue on more detailed explanation and this question on SQL details.

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

感谢@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

注意: 目前几乎没有任何其他方法有效,您甚至不能在分组依据之前应用 where。

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