Linq group by with parent object

时间:2016-05-28 17:29:09

标签: c# linq

如何分组以便不丢失父标识符。

我有以下

        var grouped = mymodel.GroupBy(l => new { l.AddressId })
            .Select(g => new
            {
                AddressId = g.Key.AddressId,
                Quotes = g.SelectMany(x => x.Quotes).ToList(),
            }).ToList();

返回

  

{AddressId1,[Quote1,Quote2,Quote3 ...]}

     

{AddressId2,[Quote12,Quote5,Quote8 ...]}

现在我想通过Quote.Code和Quote.Currency对这些进行分组,这样每个地址都有1个对象引用(即如果属于该地址的所有4个引号都具有相同的代码和货币)。我希望该对象中的货币总和。

这样可行,但我无法了解如何为此结果添加地址:

        var test = grouped.SelectMany(y => y.Quotes).GroupBy(x => new { x.Code, x.Currency }).Select(g => new 
        {
            test = g.Key.ToString()
        });}
每当我尝试将AddressId添加到结果时,

就会出现编译错误:

        var test1 = grouped.SelectMany(y => y.Quotes, (parent, child) => new { parent.AddressId, child }).GroupBy(x => new { x.Provider, x.Code, x.Currency, x.OriginalCurrency }).Select(g => new
        {
            test = g.Key.ToString(),
            Sum = g.Sum(x => x.Price)
        });

编译器错误:

        var test1 = grouped.Select(x => new { x.AddressId, x.Quotes.GroupBy(y => new { y.Provider, y.Code, y.Currency, y.OriginalCurrency }).Select(g => new
        {
            addr = x.AddressId,
            test = g.Key.ToString(),
            Sum = g.Sum(q => q.Price)
        };

1 个答案:

答案 0 :(得分:2)

我会这样做:

    var grouped = mymodel.GroupBy(l => new { l.AddressId })
        .Select(g => new
        {
            AddressId = g.Key.AddressId,
            QuotesByCode = g.SelectMany(x => x.Quotes)
                            .GroupBy(x=>x.Code)
                            .Select(grp=>new
                              {
                                Code = grp.Key.Code,
                                SumOfCurrency=grp.Sum(z=>z.Currency)
                              }).ToList(),
        }).ToList();