LINQ Group成为一个新对象

时间:2017-06-09 14:13:27

标签: c# linq

我们正在研究一些LINQ的东西,并且是使用GroupBy扩展的新手。

我正在编辑此帖子以包含我的实际代码,因为我尝试使用一些简单的示例,但它似乎让那些试图帮助的人更加困惑。对不起。

注意我们需要将下面的Amount字段相加。我们还没有尝试,因为我们只想弄清楚如何从groupBy中提取列表。

这是我的代码:

myCSTotal2.AddRange(userTotals.Where(w => w.priceinfoId == priceinfoID).GroupBy(g => g.termLength, o => new Model.MyCSTotal2
                            {
                                PriceinfoID = o.priceinfoId,
                                BillcodeID = o.billcodeid,
                                JobTypeID = o.jobtypeID,
                                SaleTypeID = o.saletypeID,
                                RegratesID = o.regratesID,
                                NatAccPerc = o.natAcctPerc,
                                NatIgnInCommCalc = o.natIgnInCommCalc,
                                TermLength = (int)o.termLength,
                                Amount = o.RMR1YrTotal / 12,
                                RuleEvaluation = 0
                            }).Select(grp => grp.ToList()));

尝试执行此操作时出现的错误是:

  

参数1:无法转换   IEnumerable<List<MyCSTotal2>>IEnumerable<MyCSTotal2>

编辑:谢谢你的帮助。以下是我们最终的结果:

myCSTotal2.AddRange(userTotals.Where(w => w.priceinfoId == priceinfoID)
                                .GroupBy(g => g.termLength)
                                .SelectMany(cl => cl.Select( o => new Model.MyCSTotal2
                            {
                                PriceinfoID = o.priceinfoId,
                                BillcodeID = o.billcodeid,
                                JobTypeID = o.jobtypeID,
                                SaleTypeID = o.saletypeID,
                                RegratesID = o.regratesID,
                                NatAccPerc = o.natAcctPerc,
                                NatIgnInCommCalc = o.natIgnInCommCalc,
                                TermLength = (int)o.termLength,
                                Amount = cl.Sum(m=>m.RMR1YrTotal / 12),
                                RuleEvaluation = 0
                            })));

2 个答案:

答案 0 :(得分:1)

我认为没有理由使用GroupBy,因为没有涉及聚合函数。如果你想通过termLength让人不同。写一个DistinctBy。您将以这种方式获得所需的集合

public static IEnumerable<TSource> DistinctBy<TSource, TKey>
        (this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
    {
        HashSet<TKey> seenKeys = new HashSet<TKey>();
        foreach (TSource element in source)
        {
            if (seenKeys.Add(keySelector(element)))
            {
                yield return element;
            }
        }
    }

然后使用像这样的扩展名

var collection = userTotals
    .Where(w => w.priceinfoId == priceinfoID)
    .DistinctBy(g => g.termLength)
    .Select(o => new Model.MyCSTotal2
        {
            PriceinfoID = o.priceinfoId,
            BillcodeID = o.billcodeid,
            JobTypeID = o.jobtypeID,
            SaleTypeID = o.saletypeID,
            RegratesID = o.regratesID,
            NatAccPerc = o.natAcctPerc,
            NatIgnInCommCalc = o.natIgnInCommCalc,
            TermLength = (int)o.termLength,
            Amount = o.RMR1YrTotal / 12,
            RuleEvaluation = 0
        });

答案 1 :(得分:1)

为了展平群组,您需要使用SELECT COUNT(*), Sub_Type, Main_Type FROM yourTable GROUP BY Sub_Type, Main_Type ORDER BY Main_Type, Sub_Type 扩展方法:

SelectMany

但如果这是您当前的查询,则无需分组,则需要使用SelectMany(grp => grp.ToList()) 投影您的收藏集:

Select