Groupe Par Plusieurs Colonnes

Comment puis-je Grouper par plusieurs colonnes dans LINQ

quelque chose de similaire à ceci en SQL:

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

Comment puis-je convertir ceci en 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
824
demandé sur leppie 2009-05-11 11:24:39
la source

12 ответов

utilisez un type anonyme.

Eg

group x by new { x.Column1, x.Column2 }
1063
répondu leppie 2009-05-11 11:37:04
la source

échantillon de procédure

.GroupBy(x => new { x.Column1, x.Column2 })
644
répondu Mo0gles 2012-05-08 11:38:17
la source

Ok obtenu comme suit:

var query = (from t in Transactions
             group t by new {t.MaterialID, t.ProductID}
             into grp
                    select new
                    {
                        grp.Key.MaterialID,
                        grp.Key.ProductID,
                        Quantity = grp.Sum(t => t.Quantity)
                    }).ToList();
426
répondu Sreedhar 2011-09-05 18:12:16
la source

pour Group By Multiple Columns, essayez ceci à la place...

GroupBy(x=> new { x.Column1, x.Column2 }, (key, group) => new 
{ 
  Key1 = key.Column1,
  Key2 = key.Column2,
  Result = group.ToList() 
});

de la même façon que vous pouvez ajouter la Colonne3, la Colonne4, etc.

125
répondu Milan 2015-12-30 21:26:26
la source

depuis C# 7 vous pouvez également utiliser valeur tuples:

group x by (x.Column1, x.Column2)

ou

.GroupBy(x => (x.Column1, x.Column2))
16
répondu Nathan Tregillus 2017-11-01 18:26:12
la source

vous pouvez également utiliser un Tuple<> pour un groupement fortement typé.

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),
}
15
répondu Jay Bienvenu 2015-12-29 23:14:34
la source

bien que cette question concerne les propriétés group by class, si vous voulez grouper par plusieurs colonnes contre un objet ADO( comme un DataTable), vous devez assigner vos" nouveaux "éléments aux variables:

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);
8
répondu Chris Smith 2018-01-17 21:17:59
la source
var Results= query.GroupBy(f => new { /* add members here */  });
6
répondu Arindam 2016-12-30 13:29:03
la source
.GroupBy(x => x.Column1 + " " + x.Column2)
3
répondu Kai Hartmann 2017-05-19 09:41:11
la source

groupe x Par nouveau { X. Col, X. Code 151910920"

2
répondu John 2017-10-23 18:14:22
la source

.GroupBy(x => (x.MaterialID, x.ProductID))

2
répondu Let's Enkindle 2017-12-27 14:36:38
la source

une chose à noter est que vous devez envoyer un objet pour les expressions Lambda et ne pouvez pas utiliser une instance pour une classe.

exemple:

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

    public string Prop2 { get; set; }
}

cela compilera mais générera une clé par cycle .

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

si vous ne voulez pas nommer les propriétés clés et ensuite les retirer vous pouvez le faire comme ceci à la place. Ce sera GroupBy correctement et vous donner les propriétés clés.

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;
}
0
répondu Ogglas 2018-04-26 23:53:09
la source

Autres questions sur .net linq group-by aggregate