我使用的是实体框架核心版本3.1.5。
我想把结果按日期分组,比如说按年份。我的最终目标是得到一个组的实体的某些属性的值的总和,但是我甚至没有在没有这个总和的情况下进行分组。我尝试了下面链接中的所有答案,但所有的尝试最终都抛出了一个异常,并显示了一条消息
system.invalidoperationexception:无法翻译linq表达式“dbset.groupby()},keyselector:yyy)”。以可翻译的形式重写查询,或者通过插入对asenumerable()、AsAsAsAsyncEnumerable()、tolist()或ToListSync()的调用显式切换到客户端计算。
代码示例:
var result = await _tenantDbContext.MetricEntities.GroupBy(o => new { o.MetricType, o.CreatedDate.Value.Year }).Select(g => g.Sum(o => o.Value)).ToListAsync();
var result = await _metricRepository.GetQueryable().GroupBy(metric => DbFunctions.TruncateTime(metric.CreatedDate)).OrderBy(group => group.Key).ToListAsync();
var result = await _metricRepository.GetQueryable().GroupBy(metric => DbFunctions.CreateTime(metric.CreatedDate.Value.Year,null,null)).ToListAsync()
var result = _tenantDbContext.MetricEntities
.GroupBy(x =>
SqlFunctions.DateAdd("month", SqlFunctions.DateDiff("month", sqlMinDate, x.CreatedDate),
sqlMinDate))
.Select(x => new
{
Period = x.Key // DateTime type
}).ToListAsync();
var result = await _globalDbContext.MetricEntities.GroupBy(x =>
new
{
Year = x.CreatedDate.Value.Year
},
s => new
{
InsertCount = s,
}
).Select(g=>new
{
InsertCount = g.Count(),
}).ToListAsync();
链接:
实体框架:按月高效分组
https://atashbahar.com/post/2017-04-27-group-by-day-week-month-quarter-and-year-in-entity-framework
https://entityframework.net/knowledge-base/19225895/linq---grouping-by-date-and-selecting-count
更多链接:
https://www.codeproject.com/questions/1199021/linq-group-by-month-year-and-return-a-sum
在iqueryable中按小时分组
https://www.mikesdotnetting.com/article/257/entity-framework-recipe-grouping-by-year-and-month
ef core“group by无法翻译,将在本地进行评估。”
https://entityframeworkcore.com/knowledge-base/58102821/translating-query-with-group-by-and-count-to-linq
https://entityframeworkcore.com/knowledge-base/43728317/linq-group-by-method-not-generating-the-expected-sql
https://www.mikesdotnetting.com/article/257/entity-framework-recipe-grouping-by-year-and-month
2条答案
按热度按时间j5fpnvbx1#
仔细看看这个错误,它是关于:
linq
,GroupBy
它告诉我它不能被“翻译”。您正在尝试执行sql不支持的操作,很可能是在lambda函数中调用了c函数。所以,基本上是说:要么改变它,要么在记忆中做。
最快的解决方法是在内存中进行,但它会导致大量数据传输。
所以不是:
尝试:
gfttwv5a2#
唯一适合我的是:
当然,您可以添加月、日、小时等。