Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何根据日期和时间进行分组?_C#_Entity Framework_Linq_Linq Method Syntax - Fatal编程技术网

C# 如何根据日期和时间进行分组?

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

我有一张桌子,可以在集市上存放参观日。例如,从“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; }

}
公共类统计学家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())
                };