使用Group By在LINQ聚合中的特定单个属性

时间:2013-10-29 15:32:49

标签: c# asp.net linq

这是我的实体类:

public class DettaglioRiga
{
    public int OrdId { get; set; }
    public string OrdStato { get; set; }
    public string ProdCodice { get; set; }
    public string ProdModelNumber { get; set; }
    public string ProdNome { get; set; }
    public string ProdTipo { get; set; }
    public int ProdQuantitaAcquistata { get; set; }
    public int ProdQuantitaTotale { get; set; }
    public double ProdCostoSingolo { get; set; }
    public double ProdCostoTotale { get; set; }
    public double ProdSpeseSpedizione { get; set; }

    public DettaglioRiga()
    {
    }
}

然后我填写一个名为 ordiniFiltrati 的集合,现在我需要创建一个聚合集合,如下所示:

List<DettaglioRiga> listaProdotti = ordiniFiltrati
    .Where(p => p.ProdTipo == "PRODOTTO")
    .OrderBy(q => q.ProdNome)
    .ToList();

var listaProdottiFiltrata = listaProdotti
    .Distinct()
    .GroupBy(g => new { g.ProdNome })
    .Select(group => new DettaglioRiga
    {                    
        ProdNome = group.Key.ProdNome,
        ProdCodice = group.ProdCodice,   // (?)I cannot get this
        ProdQuantitaTotale = group.Sum(D => D.ProdQuantitaTotale), 
        ProdCostoSingolo = group.Sum(C => C.ProdCostoSingolo) 
    });

基本上我需要获得“ProdCodice”的值并分配给新的 DettaglioRiga 对象。我无法得到它,任何提示?

编辑:我将添加更多详细信息:

谢谢你的回答,但我的情况有点棘手。这是我的数据:

ProdCodice  ProdNome
S-3850759   Driller A
S-3850755   Driller A
S-3850759   Driller A
S-3851196   Driller B

基本上我需要将ProdCodice与ProdName相比较。在这个例子中,我将有一行:

ProdCodice  ProdNome
S-3850759   Driller A
S-3850755   Driller A
S-3851196   Driller B

我想我必须将ProdName和ProdCodice分组

2 个答案:

答案 0 :(得分:1)

您需要将ProdCodice添加到分组键:

var listaProdottiFiltrata = listaProdotti
    .Distinct()
    .GroupBy(g => new { g.ProdNome, g.ProdCodice })  // <-- added another value to group on
    .Select(group => new DettaglioRiga
    {                    
        ProdNome = group.Key.ProdNome,
        ProdCodice = group.Key.ProdCodice,   
        ProdQuantitaTotale = group.Sum(D => D.ProdQuantitaTotale), 
        ProdCostoSingolo = group.Sum(C => C.ProdCostoSingolo) 
    });

或使用聚合函数指定您想要的。一些选择:

ProdCodice = group.First().ProdCodice,   

ProdCodice = group.Max(g => g.ProdCodice),  

答案 1 :(得分:1)

试试这个:

List<DettaglioRiga> listaProdotti = ordiniFiltrati.Where(p => p.ProdTipo == "PRODOTTO").OrderBy(q => q.ProdNome).ToList();
            var listaProdottiFiltrata = listaProdotti.Distinct().GroupBy(g => new { g.ProdNome }).Select(group => new  
{                    
    ProdNome = group.Key.ProdNome,
    ProdCodice = group.First().ProdCodice,   // (?)I cannot get this
    ProdQuantitaTotale = group.Sum(D => D.ProdQuantitaTotale), 
    ProdCostoSingolo = group.Sum(C => C.ProdCostoSingolo) 
});