I want to order the selected values by ascending distinct date.
For example i have these values in my database.
ID | Value | Date
1 | 35 | 2012/01/20
2 | 0 | 2012/01/20
3 | 10 | 2012/02/01
4 | 0 | 2012/02/01
5 | 0 | 2012/03/01
6 | 0 | 2012/03/01
Since ID 1 has a value on the 20th of January and ID 3 has a value on the 1st of February i want these two dates to be selected to my list of distinct date values. But for ID 5 and 6 both have value 0. So if value is 0 i also want the value 0 to be added.
Now my linqquery looks like this
var totalHours = (from u in context.Users
join r in context.Reports on u.Id equals r.UserId
join w in context.Weeks on r.Id equals w.ReportId
join d in context.Days on w.DayId equals d.Id
orderby d.Date ascending
where r.weekNr.Equals(currentWeek)
select d.Hour).ToList();
But this query of course gives me 35,0,10,0,0,0 as result.
Though I want it to give me 35,10,0
I dont want do pick out distinct values, say if February 1st and February 2nd has the same values. I want both these values to be added.
I would suggest to first select what you need from the first query:
var totalHours = (from u in context.Users
join r in context.Reports on u.Id equals r.UserId
join w in context.Weeks on r.Id equals w.ReportId
join d in context.Days on w.DayId equals d.Id
orderby d.Date ascending
where r.weekNr.Equals(currentWeek)
select new {id = r.UserId, hour = d.Hour, date = d.Date}).ToList();
In the above I assumed that d.Hour corresponds to the Value field in your example.
Then group by date, order by hour descending and select the first item from each group:
var distinctValues = totalHours
.GroupBy(th => th.Date)
.OrderByDescending(v => v.Max(o => o.Hour))
.Select(g => g.First());
UPDATE
To return just the list of integers for the Hour property use this instead of the above statement:
var distinctValues = totalHours
.GroupBy(th => th.Date)
.OrderByDescending(v => v.Max(o => o.Hour))
.Select(g => g.First().Hour)
.ToList();
UPDATE 2
Can you try this ?
var distinctValues = totalHours
.GroupBy(th => th.Date)
.Select(g => g.OrderByDescending(e => e.Hour))
.Select(g => g.First().Hour)
.ToList();
Do you mean that you want it grouped on date with the hours aggregated. If so would it be something like this maybe?
var totalHours = (from u in context.Users
join r in context.Reports on u.Id equals r.UserId
join w in context.Weeks on r.Id equals w.ReportId
join d in context.Days on w.DayId equals d.Id
orderby d.Date ascending
where r.weekNr.Equals(currentWeek)
).GroupBy(n => n.Date).Select(n => new { Date = n.Key, Hour = Sum(x => x.Hour) }).ToList();
Just to explain
.GroupBy(n => n.Date)
Will group the results by the date so you will get a distinct row per date
.Select(n => new { Date = n.Key, Hour = Sum(x => x.Hour) })
will select and shape the result. We are shaping into a new object. n.Key is the key that the group by worked on so this will be Date. The second property is the aggregate of the hours so each distinct date will have it's hours summed. We are using the new keyword so the results are put into a new custom object. We have defined the names of the properties of the new object so there will be two - Date and Hour
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With