如何根据每天的最大日期时间值过滤数据

时间:2014-08-21 09:06:54

标签: c# linq datetime linq-to-entities

例如:

 ID Name Age Salary ClicksAsofToday  Timestamp

 1. Arun  25 25000    5               Aug,20 10.50pm
 2. Arun  25 2000     8               Aug,20 10.55pm
 3. Arun  25 25000    13              Aug,20 11.00pm
 4. Vijay 25 20000    2               Aug,20 10.50pm
 5. Vijay 25 20000    3               Aug,20 10.55pm
 6. Vijay 25 20000    8               Aug,20 11.00pm
 7. Vijay 25 20000    3               Aug,21 10.55pm
 8. Vijay 25 20000    8               Aug,21 12.00pm

我希望结果为

 ID Name Age Salary  ClicksAsofToday  Timestamp

 1. Arun  25 25000    13              Aug,20 11.00pm (Max time of that Particular date)
 2. Vijay 25 20000    8               Aug,20 11.00pm
 8. Vijay 25 20000    8               Aug,21 12.00pm (Max time of another date)

时间戳列的类型为DateTime

1 个答案:

答案 0 :(得分:0)

使用以下数据:

public class Data
{
    public String Name
    {
        get;
        set;
    }

    public DateTime TimeStamp
    {
        get;
        set;
    }

    public Data(String name, DateTime timeStamp)
    {
        this.Name = name;
        this.TimeStamp = timeStamp;
    }

    public override string ToString()
    {
        return String.Format("{0} at {1}", this.Name, this.TimeStamp);
    }
}

您可以使用:

var source = new Data[]
{
    new Data("Yesterday early", DateTime.Today.AddDays(-1)),
    new Data("Yesterday middle", DateTime.Today.AddDays(-1).AddHours(2)),
    new Data("Yesterday middle", DateTime.Today.AddDays(-1).AddHours(2)),
    new Data("Yesterday late", DateTime.Today.AddDays(-1).AddHours(3)),

    new Data("Today early", DateTime.Today),
    new Data("Today middle", DateTime.Today.AddHours(2)),
    new Data("Today late 1", DateTime.Today.AddHours(3)),
    new Data("Today late 2", DateTime.Today.AddHours(3)),

    new Data("Tomorrow early", DateTime.Today.AddDays(1)),
    new Data("Tomorrow middle", DateTime.Today.AddDays(1).AddHours(2)),
    new Data("Tomorrow late 1", DateTime.Today.AddDays(1).AddHours(3)),
    new Data("Tomorrow late 2", DateTime.Today.AddDays(1).AddHours(3)),
};


var lateInDays = source.
    GroupBy((data) => data.TimeStamp.Date).
    Select(dayGroup =>
        new 
        {
            DayGroup = dayGroup, 
            MaxTimeInDay = dayGroup.Max(data => data.TimeStamp)
        }).
    SelectMany((dayGroupWithMaxTime) =>
        dayGroupWithMaxTime.
            DayGroup.
            Where(data =>
                (data.TimeStamp == dayGroupWithMaxTime.MaxTimeInDay)));

这远非最佳,但它确实有效。

工作原理:

1。 GroupBy((data) => data.TimeStamp.Date). - 按日期对数据项进行分组(三天有三组)

2。部分:

 Select(dayGroup =>
        new 
        {
            DayGroup = dayGroup, 
            MaxTimeInDay = dayGroup.Max(data => data.TimeStamp)
        }).

增加三个每日组中的每个组,其中包含有关其最大时间的信息(实际上是完整的DateTime,因此您可能希望使用DateTime.TimeOfDay属性而不是完整的DateTime)

3。部分

 SelectMany((dayGroupWithMaxTime) =>
        dayGroupWithMaxTime.
            DayGroup.
            Where(data =>
                (data.TimeStamp == dayGroupWithMaxTime.MaxTimeInDay)));

从每个小组(每天)选择所有记录,每天最长时间,只需简单地将每个记录的TimeStamp与最大日期(当前组(日))进行比较:

 dayGroupWithMaxTime.
     DayGroup.
     Where(data =>
               (data.TimeStamp == dayGroupWithMaxTime.MaxTimeInDay))