C# 如何根据日期和时间进行分组?
我有一张桌子,可以在集市上存放参观日。例如,从“a”天到“b”天,参观者参观展览会。我写了一个基于访问日期的查询。但它给了我“每天多少次访问” 我的问题是:C# 如何根据日期和时间进行分组?,c#,entity-framework,linq,linq-method-syntax,C#,Entity Framework,Linq,Linq Method Syntax,我有一张桌子,可以在集市上存放参观日。例如,从“a”天到“b”天,参观者参观展览会。我写了一个基于访问日期的查询。但它给了我“每天多少次访问” 我的问题是: var visitDays = from v in _dbContext.VisitorEvents join e in _dbContext.VisitorEvents on v.VisitorId equals e.VisitorId w
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; }
}
公共类统计学家temdto
{
公共字符串名称{get;set;}
公共int值{get;set;}
公共整数百分比{get;set;}
公共整数总计{get;set;}
公共列表小时数{get;set;}
}
好吧,原则是一样的。您正在使用EntityFunctions.TruncateTime(v.VisitDay)
删除分组中的整个时间部分,但是,您应该只删除分钟和秒
我希望使用它会有所帮助(我假设VisitDay
属性包含访问的日期时间值):
我想分组的日期,然后在每个日期组的基础上小时
因此,您必须使用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
的function。此外,还可以使用EntityFunctions
。如果您使用的是较新版本的EF,则应将其更改为DbFunctions
我让你看看返回的匿名类型的结构,也许你想重新定义统计学家temdto
如果转换为int不起作用,试试-v.VisitDay.Ticks
。亲爱的@emad我想按日期分组,然后在每个日期组中按小时分组。@Afsaneh我不明白你的意思?如果你有小分组,你就有大分组。例如,你已经有(5,7,4)三天了。现在,您将获得(1,0,0,2,5,1,0,0,1,1,1,2,0,0)每小时所需的每个小时的结果。您希望获得4天的4张图表。每天每小时都有大量的访客。很抱歉我帮不了你。我个人给你的建议是,你应该采取不同的方法,每小时拿出不同的清单,然后在记忆中把它们分成几天。
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())
};