0

我有一张桌子,其中存储了展览会的参观日。例如,参观者从“a”天到“b”天参观展览会。我根据访问日期编写了一个查询绞盘组。但它给了我“每天有多少次访问”。

这是我的查询:

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; }

}
4

2 回答 2

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);
     }
于 2017-01-07T08:34:07.980 回答
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映射到规范函数的函数DATEPART。此外,您使用EntityFunctions. 如果您使用的是较新版本的 EF,则应将其更改为DbFunctions.

我留给您查看返回的匿名类型的结构,并可能决定您要重新定义StatisticItemDto.

于 2017-01-07T21:22:08.967 回答