KingOfBabu
KingOfBabu

Reputation: 409

.NET when grouping records by hour impossible to use datetime in the select

I'm trying to group a list of records by hour and store the number of record for each hour. Here is my code :

        DateTime firstTimeStamp = myRecords.DataBaseRecords.First().TimeStamp;
        Statistics = myRecords.DataBaseRecords
         .GroupBy(x => x.TimeStamp.Hour)
          .Select(group => new GraphModel() { Date =firstTimeStamp.AddHours(group.Key), Value = group.Count() })
        .ToList();

The problem is that when I'm on the select fuction, I cannot acces to the DateTime anymore so the field group.key contains a value between 0 and 24. I just need to group all the records by hour and foreach hour, I need to have the number of records in the Value parameter.

Upvotes: 0

Views: 276

Answers (2)

Gert Arnold
Gert Arnold

Reputation: 109080

You have to group the data by absolute hours as of the first timestamp, i.e. the differences in hours calculated for each TimeStamp value:

Statistics = myRecords.DataBaseRecords
                      .GroupBy(x => DbFunctions.DiffHours(firstTimeStamp, x.TimeStamp) into g
                      .Select(g => new GraphModel
                      {
                          Date = g.FirstOrDefault().TimeStamp,
                          Value = g.Count()
                      };

If this is plain LINQ to objects (not Entity Framework) you can replace ...

DbFunctions.DiffHours(firstTimeStamp, x.TimeStamp)

... by

(x.TimeStamp - firstTimeStamp).TotalHours

If it's LINQ to SQL, use

SqlMethods.DateDiffHour(firstTimeStamp, x.TimeStamp)

Upvotes: 2

Ingenioushax
Ingenioushax

Reputation: 718

Perhaps something like this may work out for you:

DateTime myDateTime = new DateTime(DateTime.Parse(firstTimeStamp).AddHours(group.Key).Ticks);

Question specific to answer above:

 ...Date = new DateTime(DateTime.Parse(firstTimeStamp).AddHours(group.Key))...

Upvotes: 0

Related Questions