2012-05-02 92 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

相關問題