当orderby不同的日期时,选择值tolist()

时间:2012-05-02 09:13:17

标签: c# silverlight linq entity-framework linq-to-sql

我想通过提升不同的日期来排序所选的值。

例如,我在我的数据库中有这些值。

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

由于ID 1在1月20日具有值,而ID 3在2月1日具有值,因此我希望将这两个日期选择到我的不同日期值列表中。但是对于ID 5和6都具有值0.因此,如果值为0,我还希望添加值0。

现在我的linqquery看起来像这样

        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();

但是这个查询当然给了我35,0,10,0,0,0的结果。 虽然我希望它给我35,10,0

我不想要选择不同的值,比如2月1日和2月2日是否具有相同的值。我想要添加这两个值。

3 个答案:

答案 0 :(得分:5)

我建议首先从第一个查询中选择您需要的内容:

 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();

在上面我假设d.Hour对应于你的例子中的Value字段。

然后按日期分组,按小时递减,并从每个组中选择第一项:

var distinctValues = totalHours
                .GroupBy(th => th.Date)
                .OrderByDescending(v => v.Max(o => o.Hour))
                .Select(g => g.First());

<强>更新

要仅返回Hour属性的整数列表,请使用此代替上述语句:

 var distinctValues = totalHours
                .GroupBy(th => th.Date)
                .OrderByDescending(v => v.Max(o => o.Hour))
                .Select(g => g.First().Hour)
                .ToList();

更新2

你能试试吗?

var distinctValues = totalHours
                .GroupBy(th => th.Date)
                .Select(g => g.OrderByDescending(e => e.Hour))
                .Select(g => g.First().Hour)
                .ToList();

答案 1 :(得分:2)

你的意思是你希望它按照汇总的小时数分组。如果是这样的话可能就是这样吗?

 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(); 

只是解释

.GroupBy(n => n.Date)

将按日期对结果进行分组,以便每个日期获得一个不同的行

.Select(n => new { Date = n.Key, Hour = Sum(x => x.Hour) })

将选择并整形结果。我们正在塑造一个新的对象。 n.Key是该小组工作的关键,因此Datenew。第二个属性是小时的总和,因此每个不同的日期将它的小时数相加。我们使用Date关键字,因此结果将放入新的自定义对象中。我们已经定义了新对象的属性名称,因此会有两个 - Hour和{{1}}

答案 2 :(得分:0)

 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).Distinct().OrderByDescending( n => n ).ToList();