2017-06-09 11 views
1

LINQの作業に取り組んでおり、GroupBy拡張機能を初めて使用しています。LINQ 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<MyCSTotal2>

EDITに IEnumerable<List<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

のような拡張機能を使用すると、このよう

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

希望のコレクションを取得します:

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を使用する理由はありません。 PersonをtermLengthで区別したい場合。 DistinctByを書く。あなたはSelectMany拡張メソッドを使用する必要があるグループを平坦化するためには、この

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

あなたは正しいです。実際には、[金額]フィールドを合計する必要があります。私はまだコードに追加していませんでしたが、グループから必要なリストを抽出するという問題を克服しようとしていました。私は自分の投稿を編集します。(distinctByは別の領域で私たちに有益ですが)。 – melegant

+0

@melegant、それは、あなたが "リストのリスト"をAddRangeメソッドに渡していることです。各グループから人のリストを受け取り、その人のリストを選択します。その結果、人のリストが表示されます。 octaviocclが書いたように、代わりにSelectManyを使用してください。 "リストのリスト"を1つの "リスト"にまとめます。詳細はこちらhttps://msdn.microsoft.com/ru-ru/library/bb534336(v=vs.110).aspx – papadoble151

+0

ありがとうございました。非常に役に立ちました。私たちが直面している別のケースでは、別の拡張機能を使用できます。 – melegant

関連する問題