我有一张桌子可以存放参观展览会的日子。例如,参观者从白天参观展览会" 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; }
}
答案 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
。