2012-05-02 59 views
6

我想通过升序不同的日期来订购选定的值。选择值tolist()时orderby不同日期

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

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

你想分组并按价值排列你的清单吗? – ARZ

+0

@rickard - 所以如果有一个值不是0(id 1),然后另一个值是0(id 2),你只想要非零值?这是否可能发生,id 1 = 35,id 2 = 50?如果是这样,你想吗? –

+0

@Joanna如果值相同的日期(在这种情况下为0),我也希望将值0添加到列表()。 – rickard

回答

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

UPDATE

要为小时物业使用只返回一个整数列表这个代替上述声明的:

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

UPDATE 2

你可以试试吗?

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

我完成这些步骤后是否要返回disticntValues?当我尝试我得到这个错误“不能隐式转换类型'System.Collections.Generic.IEnumerable '到'System.Collections.Generic.List '。存在明确的转换(你是否缺少转换? )“ – rickard

+0

如果我把.ToList()后.Select(g => g.First())。ToList();我得到“不能隐式转换类型'System.Collections.Generic.List '到'System.Collections.Generic.List ''” – rickard

+0

@ rickard - 是的,'distinctValues'应该是你要找的东西。如果你只想从匿名类型中获得一个属性,那么将最后一行改为'.Select(g => g.First()。Hour)'(或者你需要的任何其他属性)。 ToList()调用应该工作得很好,然后给你一个'int'的列表 - 参见更新 –

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

我不想挑选不同的值,只有不同的日期。所以如果有多个日期,比如说2月1日和2月2日有相同的价值。这种方法只给我这些日子之一。 – rickard

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) }) 

鲜明的行会选择与塑造的结果。我们正在塑造一个新的对象。​​是这个团队的关键,所以这将是Date。第二个属性是小时数的总和,因此每个不同的日期将会有小时数的总和。我们正在使用new关键字,以便将结果放入新的自定义对象中。我们定义的新对象的属性的名称,这样将有两个 - DateHour

+0

是的,这是我之后的结果。但我不明白在这段代码中的一切,它给了我错误,所以我无法正确地测试它。 – rickard

+0

对不起,我把它写在我的头顶 - 什么错误 –

+0

“查询正文必须以select子句或group子句结束”和“无法隐式转换类型”System.Collections.Generic.List ' 'System.Collections.Generic.List '“和”Select子句中表达式的类型不正确,在对'Select'的调用中类型推断失败。 – rickard

相关问题