LINQ to Entitys-以小时为单位的时间差不正确

本文关键字:时间差 不正确 为单位 小时 to Entitys- LINQ | 更新日期: 2023-09-27 18:28:38

我的Sql Server数据库中有一个名为"Videos"的表。我正在使用LINQ to Entities从C#应用程序访问该数据库中的数据。"视频"表包括名为"RecordingStarted"answers"RecordingEnded"的两列,这两列只会告诉我们录制视频的开始和结束日期时间。每个视频都有一个唯一的ID,并根据一个单元(这里的单元我指的是,例如手机)进行记录。

"视频"表格样本数据如下:

UnitID  VideoID        RecordingStarted            RecordingEnded
====================================================================
Unit-1  vid1           2012/1/1 14:30:00           2012/1/1 15:45:10
Unit-1  vid2           2012/2/1 12:30:00           2012/1/1 12:50:00
Unit-2  vid3           2012/3/1 14:30:00           2012/3/1 15:45:10
Unit-2  vid4           2012/4/1 12:30:00           2012/4/1 12:40:00

使用LINQ to Entities,我想计算报告的聚合数据,以及每个单元的聚合数据(如每个单元录制的视频小时总数)。

输出应如下所示:

UnitID     Total Video Hours
================================================
Unit-1      0.58611
Unit-2      0.41944

我已经创建了以下LINQ到实体的查询,但它并没有给我正确的结果。(我猜小时除以3600后四舍五入为0)

IQueryable<dynamic> qry = myContext.Videos
.GroupBy(v => new { v.UnitID })
.Select(g => new
{
    g.Key.UnitID,
    TotalVideoHours = g.Sum(c => SqlFunctions.DateDiff("s", c.RecordingStarted, c.RecordingEnded)/3600)
});
var result = qry.ToList();

另外:我需要将小时四舍五入到2位数字(直接从Sql Server中提取,以后不使用内存中的操作)。

我该怎么做?请帮忙。

LINQ to Entitys-以小时为单位的时间差不正确

您的原始代码正在除以3600,这将截断除以3600时得到的分数小时:您需要使用3600.0。然后,我们可以使用EntityFunctions进行有意的截断。截断可以获得漂亮的2位数格式。也不确定您为什么需要IQueryable<dynamic>

var qry = s.Videos
.GroupBy(v => new { v.Name })
.Select(g => new
{
    g.Key.Name,
    TotalVideoHours = EntityFunctions.Truncate(g.Sum(c => SqlFunctions.DateDiff("s", c.RecordingStarted, c.RecordingEnded) / 3600.0), 2)
});