簡體   English   中英

LINQ GroupBy進入新對象

[英]LINQ GroupBy into a new object

我們正在處理一些LINQ東西,並且是使用GroupBy擴展的新手。

當我嘗試使用一些簡單的示例時,我正在編輯此帖子以包含我的實際代碼,但是對於那些試圖提供幫助的人來說,這似乎使它更加混亂。 抱歉

注意我們需要對以下“金額”字段求和。 我們還沒有嘗試過,因為我們只是想弄清楚如何從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
                            })));

我認為沒有理由使用GroupBy,因為其中不涉及聚合函數。 如果您想讓Persons通過termLength進行區分。 寫一個不同的。 您將以這種方式獲得所需的收藏

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
        });

為了展平組,您需要使用SelectMany擴展方法:

SelectMany(grp => grp.ToList())

但是,如果這是當前查詢,則無需分組,則需要使用Select來投影集合:

myCSTotal2.AddRange(userTotals.Where(w => w.priceinfoId == priceinfoID)
                              .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
                              });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM