1184 Stimmen

Gruppieren nach mehreren Spalten

Wie kann ich GroupBy mehrere Spalten in LINQ tun

Etwas Ähnliches wie dies in SQL:

SELECT * FROM <TableName> GROUP BY <Column1>,<Column2>

Wie kann ich dies in LINQ:

QuantityBreakdown
(
    MaterialID int,
    ProductID int,
    Quantity float
)

INSERT INTO @QuantityBreakdown (MaterialID, ProductID, Quantity)
SELECT MaterialID, ProductID, SUM(Quantity)
FROM @Transactions
GROUP BY MaterialID, ProductID

44voto

AlbertK Punkte 9411

C# 7.1 oder höher mit Tuples y Inferred tuple element names (derzeit funktioniert es nur mit linq to objects und wird nicht unterstützt, wenn Ausdrucksbäume erforderlich sind, z. B. someIQueryable.GroupBy(...) . Github-Problem ):

// declarative query syntax
var result = 
    from x in inMemoryTable
    group x by (x.Column1, x.Column2) into g
    select (g.Key.Column1, g.Key.Column2, QuantitySum: g.Sum(x => x.Quantity));

// or method syntax
var result2 = inMemoryTable.GroupBy(x => (x.Column1, x.Column2))
    .Select(g => (g.Key.Column1, g.Key.Column2, QuantitySum: g.Sum(x => x.Quantity)));

C# 3 oder höher mit anonymous types :

// declarative query syntax
var result3 = 
    from x in table
    group x by new { x.Column1, x.Column2 } into g
    select new { g.Key.Column1, g.Key.Column2, QuantitySum = g.Sum(x => x.Quantity) };

// or method syntax
var result4 = table.GroupBy(x => new { x.Column1, x.Column2 })
    .Select(g => 
      new { g.Key.Column1, g.Key.Column2 , QuantitySum= g.Sum(x => x.Quantity) });

2 Stimmen

Wow, ich danke Ihnen. Das hat dem Gehirn einen Stempel aufgedrückt und die Kapazität für Möglichkeiten erhöht.

0 Stimmen

Super ----- :) :)

23voto

Jay Bienvenu Punkte 2574

Sie können auch ein Tuple<> für eine stark typisierte Gruppierung verwenden.

from grouping in list.GroupBy(x => new Tuple<string,string,string>(x.Person.LastName,x.Person.FirstName,x.Person.MiddleName))
select new SummaryItem
{
    LastName = grouping.Key.Item1,
    FirstName = grouping.Key.Item2,
    MiddleName = grouping.Key.Item3,
    DayCount = grouping.Count(), 
    AmountBilled = grouping.Sum(x => x.Rate),
}

4 Stimmen

Hinweis: Das Erstellen eines neuen Tupels wird in Linq To Entities nicht unterstützt.

10voto

Chris Smith Punkte 658

Obwohl diese Frage über Gruppe durch Klasseneigenschaften fragt, wenn Sie durch mehrere Spalten gegen ein ADO-Objekt (wie eine DataTable) gruppieren möchten, müssen Sie Ihre "neuen" Elemente zu Variablen zuweisen:

EnumerableRowCollection<DataRow> ClientProfiles = CurrentProfiles.AsEnumerable()
                        .Where(x => CheckProfileTypes.Contains(x.Field<object>(ProfileTypeField).ToString()));
// do other stuff, then check for dups...
                    var Dups = ClientProfiles.AsParallel()
                        .GroupBy(x => new { InterfaceID = x.Field<object>(InterfaceField).ToString(), ProfileType = x.Field<object>(ProfileTypeField).ToString() })
                        .Where(z => z.Count() > 1)
                        .Select(z => z);

1 Stimmen

Ich konnte die Linq-Abfrage "group c by new{c.Field<String>("Title"),c.Field<String>("CIF")}" nicht ausführen, und Sie haben mir eine Menge Zeit erspart! "group c by new{titulo= c.Field<String>("Title"),cif=c.Field<String>("CIF")} "

3voto

Ogglas Punkte 48648

Es ist zu beachten, dass Sie für Lambda-Ausdrücke ein Objekt senden müssen und keine Instanz für eine Klasse verwenden können.

Beispiel:

public class Key
{
    public string Prop1 { get; set; }

    public string Prop2 { get; set; }
}

Dies wird kompiliert, erzeugt aber eine Taste pro Zyklus .

var groupedCycles = cycles.GroupBy(x => new Key
{ 
  Prop1 = x.Column1, 
  Prop2 = x.Column2 
})

Wenn Sie die Schlüsseleigenschaften nicht benennen und sie dann wieder abrufen möchten, können Sie stattdessen so vorgehen. Dies wird GroupBy und geben Ihnen die wichtigsten Eigenschaften an.

var groupedCycles = cycles.GroupBy(x => new 
{ 
  Prop1 = x.Column1, 
  Prop2= x.Column2 
})

foreach (var groupedCycle in groupedCycles)
{
    var key = new Key();
    key.Prop1 = groupedCycle.Key.Prop1;
    key.Prop2 = groupedCycle.Key.Prop2;
}

2voto

Arindam Punkte 178
var Results= query.GroupBy(f => new { /* add members here */  });

9 Stimmen

Er fügt den vorherigen Antworten nichts hinzu.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X