我的Sql Server数据库中有一个名为“Videos”的表。我正在使用LINQ to Entities从C#应用程序访问该数据库中的数据。 “视频”表包含两个名为“RecordingStarted”和“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 to实体查询,但它没有给我正确的结果。 (我猜小时数除以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开始,之后不再使用内存操作)。
我该怎么做?请帮忙。
答案 0 :(得分:2)
您的原始代码除以3600,这会截断除以3600时得到的小时数:您需要使用3600.0。然后我们可以使用EntityFunctions.Truncate进行故意截断来获取漂亮的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)
});