我正试着从我的数据库中删除副本。我正在使用实体框架核心()和.NET 5。EF在通过以下方式实现我的组时遇到了困难:
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‘模式。在“AsEnumerable”之前调用“GroupBy”来评估它的客户端
我不想将我的所有行都物化,以删除副本。是否有一份已知问题的清单?我该如何解决这个问题呢?
发布于 2021-03-30 14:03:41
感谢@GertArnold为我指明了正确的方向。显然,EF组只支持聚合查询。
正如本文章所指出的
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核心问题 --请投票表决--因此他们实际上修复了这个问题,而不是把它推到另一个版本
发布于 2021-03-30 07:09:43
按价值计算,您的组是DateTime。只能在group子句中使用标量值,因为SQL也不能按日期分组。还可以看看本文对此问题作了更详细的解释。和关于SQL详细信息的问题。
至于解决办法,我没有尝试过,但您可能可以按时间字符串表示或滴答进行分组。
https://stackoverflow.com/questions/66863901
复制相似问题