2017-06-09 3 views
1

Wir arbeiten an einigen LINQ-Sachen und sind neu bei der Verwendung der GroupBy-Erweiterung.LINQ GroupBy in ein neues Objekt

Ich bearbeite diesen Beitrag, um meinen tatsächlichen Code einzuschließen, als ich versuchte, ein einfaches Beispiel zu verwenden, aber es scheint, dass es es verwirrender für diejenigen macht, die helfen wollen. Das tut mir leid.

HINWEIS Wir müssen das Feld Betrag summieren. Wir haben das noch nicht versucht, da wir nur versuchen herauszufinden, wie man die Liste aus der groupBy extrahiert.

Hier ist mein Code:

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

Der Fehler, den wir bekommen, wenn dies zu tun versuchen, ist:

Argument 1: von IEnumerable<List<MyCSTotal2>> zu IEnumerable<MyCSTotal2>

EDIT nicht konvertieren : Danke für die Hilfe. Hier ist, was wir am Ende mit:

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

Erbt 'PeoplePlus' von' People'? – maccettura

+1

Aber was ist der Sinn der Gruppe, wenn Sie die Liste später reduzieren müssen? – octavioccl

+0

Und was ist die Frage? – HimBromBeere

Antwort

1

Um erhalten Sie die Gruppen SelectMany Erweiterungsmethode verwenden müssen zu glätten:

SelectMany(grp => grp.ToList()) 

Aber Wenn dies Ihre aktuelle Abfrage ist, die Sie nicht gruppieren müssen, müssen Sie Ihre Sammlung mit Select:

projizieren
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

Danke Leute. Sehr hilfreich. – melegant

1

Ich sehe keinen Grund, sich mit der GroupBy, da es beteiligt keine Aggregationsfunktionen. Wenn Sie Personen nach TermLength unterscheiden möchten. Schreibe ein DistinctBy. Sie erhalten die gewünschte Sammlung auf diese Weise

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

Dann die Erweiterung verwenden wie diese

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

Sie haben Recht. Wir müssen jedoch tatsächlich das Feld 'Betrag' summieren. Ich habe das im Code noch nicht hinzugefügt, da wir nur versucht haben, das Problem zu umgehen, die Liste, die wir brauchen, aus der groupBy zu extrahieren. Ich werde meinen Beitrag bearbeiten.(obwohl distinctBy für uns in einem anderen Bereich nützlich ist). – melegant

+0

@melegant, ist, dass Sie eine "Liste von Listen" in die AddRange-Methode übergeben. Von jeder Gruppe erhalten Sie eine Liste von Personen und dann wählen Sie diese Liste aus, die zu einer Liste von Personenlisten führt. Wie Sie von octavioccl geschrieben haben, verwenden Sie stattdessen SelectMany. Es wird "Liste der Listen" in einer einzigen "Liste" aggregieren, siehe hier https://msdn.microsoft.com/ru-ru/library/bb534336(v=vs.110).aspx – papadoble151

+0

Danke. Sehr hilfreich und jetzt kann ich diese eindeutige Erweiterung für einen anderen Fall verwenden, dem wir gegenüberstehen. – melegant