EF Core 7+PostgreSQL下如何在数据库端计算TimeSpan平均值?
在EF Core 7 + PostgreSQL中实现数据库端计算时间差统计值
你的问题核心是EF Core无法翻译.Ticks属性的访问,导致无法在数据库端计算平均值。以下两种方案可以解决这个问题,且均在数据库端完成计算,避免客户端处理大数据集:
方案1:使用EF Core内置的日期差函数
通过EF.Functions.DateDiffTick直接计算两个时间的Ticks差,该函数可被EF Core翻译为PostgreSQL对应的SQL逻辑,再对Ticks求平均后转换为TimeSpan:
var stats = await _context .Jobs .GroupBy(x => x.Name) .Select(x => new Stats( x.Min(y => y.Stopped - y.Started), TimeSpan.FromTicks((long)x.Average(y => EF.Functions.DateDiffTick(y.Stopped, y.Started))), x.Max(y => y.Stopped - y.Started) )) .ToListAsync();
方案2:直接利用PostgreSQL的interval类型支持
Npgsql(PostgreSQL的EF Core驱动)支持将DateTime - DateTime的结果映射为PostgreSQL的interval类型,而PostgreSQL原生支持对interval求平均。只需直接对时间差求平均即可,EF会自动翻译为对应的SQL:
var stats = await _context .Jobs .GroupBy(x => x.Name) .Select(x => new Stats( x.Min(y => y.Stopped - y.Started), x.Average(y => y.Stopped - y.Started), x.Max(y => y.Stopped - y.Started) )) .ToListAsync();
注意:方案2需要使用7.x及以上版本的Npgsql驱动,确保AVG(interval)的翻译逻辑正常工作。
内容的提问来源于stack exchange,提问作者lonix
相关产品推荐
相关产品推荐

