2017-06-09 80 views
1

我們正在研究一些LINQ的東西,並且是使用GroupBy擴展的新手段。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 
          }))); 
+0

PeoplePlus是否從People繼承? – maccettura

+1

但是,如果您以後需要將列表展平,那麼組的意義何在? – octavioccl

+0

什麼是問題? – HimBromBeere

回答

1

爲了壓扁你需要使用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 
           }); 
+0

謝謝大家。很有幫助。 – melegant

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

你是對的。實際上我們需要總結'金額'字段。我沒有在代碼中加入,因爲我們只是試圖從groupBy中提取我們需要的列表。我將編輯我的帖子。(儘管distinctBy在另一個領域對我們很有用)。 – melegant

+0

@melegant,事情是,你正在將「列表清單」傳遞給AddRange方法。從每個組中您將收到一個人員列表,然後您將選擇該列表,從而生成一份人員列表。隨着octavioccl寫信給你,請改用SelectMany。它會將「列表清單」彙總到一個「列表」中,詳情請參閱https://msdn.microsoft.com/ru-ru/library/bb534336(v=vs.110).aspx – papadoble151

+0

謝謝。非常有幫助,現在我可以使用這個獨特的擴展來處理我們正面臨的另一個案例 – melegant