如何根据日期分组呢?

时间:2017-01-07 08:06:53

标签: c# entity-framework linq linq-method-syntax

我有一张桌子可以存放参观展览会的日子。例如,参观者从白天参观展览会" a"到了白天" b"。我根据访问日期写了一个查询winch组。但它给了我"每天多少次访问"。

这是我的查询:

var visitDays = from v in _dbContext.VisitorEvents
                         join e in _dbContext.VisitorEvents on v.VisitorId equals e.VisitorId
                         where e.EventId == eventId
                         group v by EntityFunctions.TruncateTime(v.VisitDay) into g
                         select new StatisticItemDto()
                         {
                             Name = g.Key.ToString(),
                             Value = g.Count()
                         };
         total =visitDays.Any()? visitDays.Sum(x => x.Value):0;
         foreach (var item in visitDays)
         {
             item.Percent = Framework.Utility.GetPercent(item.Value, total);
         }

但我想要的不仅仅是这个查询?我的意思是每天每小时的访客数量。从示例第1天上午9:00到下午17:00。 "每天每小时访问多少次"还有其他日子。 我希望我的问题清楚明白吗?

 public class StatisticItemDto
{
    public string Name { get; set; }
    public int Value { get; set; }
    public int Percent { get; set; }
    public int Total { get; set; }
    public List<StatisticItemDto> Hours { get; set; }

}

2 个答案:

答案 0 :(得分:0)

校长是一样的。您正在删除使用EntityFunctions.TruncateTime(v.VisitDay)分组的整个时间部分,但是,您应该只删除分钟和秒数。

使用这个我希望它有所帮助(我假设VisitDay属性包含访问的DateTime值。):

var visitDays = from v in _dbContext.VisitorEvents
                     join e in _dbContext.VisitorEvents on v.VisitorId equals e.VisitorId
                     where e.EventId == eventId
                     group v by EntityFunctions.AddMicroseconds(v.VisitDay, -(int)v.VisitDay) into g
                     select new StatisticItemDto()
                     {
                         Name = g.Key.ToString(),
                         Value = g.Count()
                     };
     total =visitDays.Any()? visitDays.Sum(x => x.Value):0;
     foreach (var item in visitDays)
     {
         item.Percent = Framework.Utility.GetPercent(item.Value, total);
     }

答案 1 :(得分:0)

  

我希望按日期分组,然后根据小时在每个日期组中。

所以你必须两次使用GroupBy,这是第一次获得一组天,第二次在每天内获得一组小时:

var visitDays = from v in _dbContext.VisitorEvents
                join e in _dbContext.VisitorEvents on v.VisitorId equals e.VisitorId
                where e.EventId == eventId
                group v by EntityFunctions.TruncateTime(v.VisitDay) into g
                select new
                {
                    Name = g.Key.ToString(),
                    Value = g.GroupBy(v => SqlFunctions.DatePart("HH", v.VisitDay))
                             .Select(h => h.Key, Count = h.Count())
                };

不是我在这里使用System.Data.Entity.SqlServer.SqlFunctions,因为它包含映射到规范函数DatePart的{​​{1}}函数。另外,您使用DATEPART。如果您使用的是较新版本的EF,则应将其更改为EntityFunctions

我留给你看看返回的匿名类型的结构,并可能决定你要重新定义DbFunctions