我想通过提升不同的日期来排序所选的值。
例如,我在我的数据库中有这些值。
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日是否具有相同的值。我想要添加这两个值。
答案 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
是该小组工作的关键,因此Date
。new
。第二个属性是小时的总和,因此每个不同的日期将它的小时数相加。我们使用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();