2015-05-01 36 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