2015-05-01 65 views
0

所以我有一個小小的噩夢試圖構建一個查詢,即使它真的不應該如此困難。Linq查詢分組和按入新列表

我有一個類visitItem

public class visitItem 
{ 
    public int visitId {get; set;} 
    public int contactId {get; set;} 
    public int locationId {get; set;} 
    public DateTime FirstSeen {get; set;} 
    public DateTime LastSeen {get; set;} 
    public double Duration {get; set;} 
} 

基本上我有參觀日期的歷史中,我反序列化的visitItem列表,並形成從數據幾個不同的圖表一個JSON。

什麼我想要做的就是創建從我選擇一個特定的月份主列表一個新的列表,並將得到的列表受到的ContactID分組和持續時間總結:

List<visitItem> totalDurations = visits 
    .Where(x => x.FirstSeen.ToString("MM") == month)...... 

所以該選擇數據的相關一個月,然後我想要列表如:代替

contactId   duration 
1     10 
2     5 
3     5 
4     20 

contactId   duration 
1     5 
1     5 
2     5 
3     5 
4     10 
4     10 

我該如何做到這一點?

+0

你爲什麼要執行字符串轉換呢?當然,使用'FirstSeen.Month'會更簡單......無論如何,你沒有解釋爲什麼*你想要第一個輸出,或者輸入是什麼......目前你剛剛說過你希望它是X的Y,這給我們很少的上下文,以幫助你... –

+0

啊 - 重新格式化問題後,它更有意義。在發佈之前請注意預覽問題,以確保它確實有意義。 –

+0

接下來,你*說*你已經通過contactId分組了,但是你根本沒有顯示那部分查詢,這又使得它很難提供幫助。理想情況下,提供一個簡短但完整的程序來演示這個問題... –

回答

1

您需要按月過濾,然後按聯繫人ID對項目進行分組,然後總結這些組的持續時間。例如,對於五月:

var month = 5; 

var durationByContact = from visit in visits 
         where visit.FirstSeen.Month == month 
         group visit by visit.contactId 
         into visitsByContact 
         select new 
         { 
          ContactId = visitsByContact.Key, 
          TotalDuration = visitsByContact.Sum(i => i.Duration) 
         }; 

還是在方法的語法:

var durationByContact = visits 
    .Where(v => v.FirstSeen.Month == month) 
    .GroupBy(v => v.contactId) 
    .Select(g => new 
    { 
     ContactId = g.Key, 
     TotalDuration = g.Sum(i => i.Duration) 
    }); 
+0

不,它是*過濾*按月和*分組*由聯繫人ID。 –

+0

@JonSkeet你是對的 - 問題編輯解釋得更好我不確定以前是否清楚。我已更新。 –

+0

感謝您的回覆。這正是我想要的。我只是編輯它到'Select(g => new visitItem {ContactId = g.Key,Duration = g.Sum(i => i.Duration})',以便在foreach循環中使用並避免使用一個匿名類型 – JonnyKnottsvill