6

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

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

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 日是否具有相同的值。我希望添加这两个值。

4

3 回答 3

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();
于 2012-05-02T09:47:59.850 回答
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关键字,因此将结果放入一个新的自定义对象中。我们已经定义了新对象的属性名称,所以会有两个 -DateHour

于 2012-05-02T09:40:58.670 回答
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();
于 2012-05-02T09:20:25.730 回答