Как группировать по датам и часам?
У меня есть таблица, в которой магазины посещают дни на ярмарке. например, посетители посещают ярмарки со дня "а" до дня "б". Я написал запрос лебедки группы на основе даты посещения. но это дает мне "сколько посещений в день".
вот мой запрос:
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
,