我正在尝试从我的数据库中删除重复项。我正在使用 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 的已知问题列表? 我该如何解决这个问题?
答案 0 :(得分:1)
感谢@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 请投票表决,以便他们真正解决这个问题,而不是将其推到另一个版本
答案 1 :(得分:0)
您按值分组是我猜是 DateTime。 group by 子句中只能使用标量值,因为 SQL 也不能按日期分组。 也看看 this git issue on more detailed explanation 和 this question on SQL details。
至于解决方法 - 我没有尝试过,但您可能可以按时间字符串表示或刻度进行分组。