Как группировать по датам и часам?

У меня есть таблица, в которой магазины посещают дни на ярмарке. например, посетители посещают ярмарки со дня "а" до дня "б". Я написал запрос лебедки группы на основе даты посещения. но это дает мне "сколько посещений в день".

вот мой запрос:

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 ответа

Ну основной принцип такой же. Вы удаляете целую часть времени в группе с 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);
     }

Я хочу Группировать по дате, затем в каждой группе дат по часам.

Так что вы должны использовать 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,

Другие вопросы по тегам