C# 在Enity框架中按小时分组记录并填补空白

C# 在Enity框架中按小时分组记录并填补空白,c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,之前和之后都有类似的问题,但两种解决方案都使用SQL。我想用代码解决这个问题 最简单的解决方案是运行: var q = from i in XXX.Table let dt = p.Date group i by new { y = dt.Year, m = dt.Month, d = dt.Day, h = dt.Hour} select g; 但我还有很多空白需要填补。您可以从服务器获取组并填补客户端的空白: var startDate = new DateTime

之前和之后都有类似的问题,但两种解决方案都使用SQL。我想用代码解决这个问题

最简单的解决方案是运行:

var q = from i in XXX.Table
    let dt = p.Date
    group i by new { y = dt.Year, m = dt.Month, d = dt.Day, h = dt.Hour}
    select g;

但我还有很多空白需要填补。

您可以从服务器获取组并填补客户端的空白:

var startDate = new DateTime(2014, 1, 2);
var endDate = new DateTime(2014, 1, 3);

var dict = (from c in YourTable
  where c.YourDate >= startDate && c.YourDate <= endDate 
  let hours = DbFunctions.DiffHours(startDate, c.YourDate)
  group c by hours into g 
  select new {Hour = g.Key, Count = g.Count()}).ToDictionary(r => r.Hour.Value, r => r.Count);

var result = Enumerable.Range(0, (int)(endDate - startDate).TotalHours).Select(h => new {Date = startDate.AddHours(h), Count = dict.ContainsKey(h) ? dict[h] : 0});
var startDate=新日期时间(2014,1,2);
var endDate=新的日期时间(2014年1月3日);
var dict=(来自表中的c
其中c.YourDate>=startDate和&c.YourDate r.Hour.Value,r=>r.Count);
var result=Enumerable.Range(0,(int)(endDate-startDate).TotalHours)。选择(h=>new{Date=startDate.AddHours(h),Count=dict.ContainsKey(h)?dict[h]:0});

这个查询将被组合成另一个查询,还是我们可以假设这个(以及填补的空白)将被具体化?换句话说,服务器是否必须生成填充?您的实体框架可以将
p.Date
转换为SQL?@casperOne我喜欢将此查询用作子查询,因此答案是“是”,服务器应生成fills@SergeyBerezovskiy我想是的。我在
DateTime
type@SergeyBerezovskiy你是对的,我没有检查就写了这段代码:)