C# 列表查询的分组和设置条件

C# 列表查询的分组和设置条件,c#,linq,datetime,group-by,linq-to-objects,C#,Linq,Datetime,Group By,Linq To Objects,我有一个状态对象列表,其中包含int值和datetime,格式为 2014年9月30日星期二21:22:02+0000 代码: 现在,我想在图表上显示这些信息,但仅限于过去7天 如何在C#中按日期对对象进行分组,并设法获取这些信息?我知道如何在SQL中执行此操作,但我不熟悉LINQ。尝试将以下内容添加到您的where条件中,然后您的SP/SQL查询将在7天内仅返回记录 datediff(day, created_at, getdate()) < 7 datediff(日期,创建时间,g

我有一个状态对象列表,其中包含int值和datetime,格式为

2014年9月30日星期二21:22:02+0000

代码:

现在,我想在图表上显示这些信息,但仅限于过去7天


如何在C#中按日期对对象进行分组,并设法获取这些信息?我知道如何在SQL中执行此操作,但我不熟悉LINQ。

尝试将以下内容添加到您的where条件中,然后您的SP/SQL查询将在7天内仅返回记录

datediff(day, created_at, getdate()) < 7 
datediff(日期,创建时间,getdate())<7
如果您使用int(这很糟糕,但还可以…),那么首先必须将int转换为datetime:在google上搜索
int-to-datetime

第二步是实现
TimeSpan
,并对
Datetime
TimeSpan
使用重写运算符

public bool LaterThan7Days(int valueFromClass)
{
    DateTime myTime = //here convert valueFromClass to Datetime, search in google please
    TimeSpan t = new TimeSpan(7,0 , 0, 0); //days, hours ,mins, seconds
    DateTime timeToCompare = myTime + t;
    return timeToCompare > DateTime.Now;
}
查询应该如下所示:

var query = from Status in yourContext
            where LaterThan7Days(Status.value)
            select Status;

query.ToList().Foreach(p=> Console.WriteLine(p.created_at));

我想你需要对状态进行分组,以对你的类中的其他字段进行求和或计数,这样你就可以在一天中得到一些总数

如果是,请给出以下示例

        List<Status> statusList = new List<Status>();
        statusList.Add(new Status() { Value = 12, CreatedAt = "Tue Sep 30 21:22:02 +0000 2014" });
        statusList.Add(new Status() { Value = 11, CreatedAt = "Tue Sep 30 21:22:02 +0000 2014" });
        statusList.Add(new Status() { Value = 10, CreatedAt = "Tue Sep 30 21:22:02 +0000 2014" });
        statusList.Add(new Status() { Value = 9, CreatedAt = "Sat Sep 27 21:22:02 +0000 2014" });
        statusList.Add(new Status() { Value = 8, CreatedAt = "Fri Sep 26 21:22:02 +0000 2014" });
        statusList.Add(new Status() { Value = 7, CreatedAt = "Thu Sep 25 21:22:02 +0000 2014" });
        statusList.Add(new Status() { Value = 6, CreatedAt = "Wed Sep 24 21:22:02 +0000 2014" });
        statusList.Add(new Status() { Value = 5, CreatedAt = "Tue Sep 23 21:22:02 +0000 2014" });
        statusList.Add(new Status() { Value = 4, CreatedAt = "Mon Sep 22 21:22:02 +0000 2014" });
        statusList.Add(new Status() { Value = 3, CreatedAt = "Sun Sep 21 21:22:02 +0000 2014" });
        statusList.Add(new Status() { Value = 2, CreatedAt = "Sat Sep 20 21:22:02 +0000 2014" });
        statusList.Add(new Status() { Value = 1, CreatedAt = "Fri Sep 19 21:22:02 +0000 2014" });



        var groups = from status in statusList
                  let date = DateTime.ParseExact(status.CreatedAt, "ddd MMM dd HH:mm:ss zzz yyyy", CultureInfo.InvariantCulture)
                  group status by date into g
                  where g.Key.Date >= DateTime.Now - new TimeSpan(7, 0, 0, 0)
                  select g;

        foreach (IGrouping<DateTime, Status> group in groups)
        {
            DateTime day = group.Key;
            int countOfValues = group.Select(g => g.Value).Count();
            Console.WriteLine("Day: {0}", day.ToString());
            Console.WriteLine("countOfValues: {0}", countOfValues.ToString());
        }

可能的复制者:为什么将DateTime存储在字符串中而不是DateTime中。为什么将日期存储为
字符串
而不是
日期时间
?2.我很困惑。。。您真的需要一个
GroupBy
还是
Where
?这是检索JSON提要的方式。在同一天发布了几个状态,因此我想对它们进行分组并显示它们每天的总值。
        List<Status> statusList = new List<Status>();
        statusList.Add(new Status() { Value = 12, CreatedAt = "Tue Sep 30 21:22:02 +0000 2014" });
        statusList.Add(new Status() { Value = 11, CreatedAt = "Tue Sep 30 21:22:02 +0000 2014" });
        statusList.Add(new Status() { Value = 10, CreatedAt = "Tue Sep 30 21:22:02 +0000 2014" });
        statusList.Add(new Status() { Value = 9, CreatedAt = "Sat Sep 27 21:22:02 +0000 2014" });
        statusList.Add(new Status() { Value = 8, CreatedAt = "Fri Sep 26 21:22:02 +0000 2014" });
        statusList.Add(new Status() { Value = 7, CreatedAt = "Thu Sep 25 21:22:02 +0000 2014" });
        statusList.Add(new Status() { Value = 6, CreatedAt = "Wed Sep 24 21:22:02 +0000 2014" });
        statusList.Add(new Status() { Value = 5, CreatedAt = "Tue Sep 23 21:22:02 +0000 2014" });
        statusList.Add(new Status() { Value = 4, CreatedAt = "Mon Sep 22 21:22:02 +0000 2014" });
        statusList.Add(new Status() { Value = 3, CreatedAt = "Sun Sep 21 21:22:02 +0000 2014" });
        statusList.Add(new Status() { Value = 2, CreatedAt = "Sat Sep 20 21:22:02 +0000 2014" });
        statusList.Add(new Status() { Value = 1, CreatedAt = "Fri Sep 19 21:22:02 +0000 2014" });



        var groups = from status in statusList
                  let date = DateTime.ParseExact(status.CreatedAt, "ddd MMM dd HH:mm:ss zzz yyyy", CultureInfo.InvariantCulture)
                  group status by date into g
                  where g.Key.Date >= DateTime.Now - new TimeSpan(7, 0, 0, 0)
                  select g;

        foreach (IGrouping<DateTime, Status> group in groups)
        {
            DateTime day = group.Key;
            int countOfValues = group.Select(g => g.Value).Count();
            Console.WriteLine("Day: {0}", day.ToString());
            Console.WriteLine("countOfValues: {0}", countOfValues.ToString());
        }
Day: 9/30/2014 4:22:02 PM
countOfValues: 3 //Three entries on Sep 30...
Day: 9/27/2014 4:22:02 PM
countOfValues: 1
Day: 9/26/2014 4:22:02 PM
countOfValues: 1
Day: 9/25/2014 4:22:02 PM
countOfValues: 1
Day: 9/24/2014 4:22:02 PM
countOfValues: 1