Linq查询分组并汇总到新列表

时间:2015-05-01 09:24:28

标签: c# 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;}
}

基本上我在json中访问历史记录日期,我将其反序列化为visitItem列表,并从数据中形成几个不同的图表。

我想要做的是从我选择特定月份的主列表中创建一个新列表,结果列表现在按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

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

您需要按月过滤,然后按联系人ID对项目进行分组,然后将这些组的持续时间相加。例如,对于May:

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)
    });
相关问题