Linq Group BY Multiple Values

时间:2016-03-01 00:57:31

标签: c# sql-server linq group-by

我在MVC中使用我的模型创建一个组我设法得到我的3个主要值但我不知道如何在linq中为我的select添加更多数据。

这是我的Linq声明:

@foreach (var item in Model.GroupBy(a => a.Pla).Select(p => new { Pla = p.Key, Quantity = p.Sum(q => q.Cantidad), Total = p.Sum(x => x.Total) }))

这是我的表:

Con   Fecha           Rid       Pdv   Pla   Descripcion       Total Quantity
----------------------------------------------------------------------------
1     2016-01-01    COMIDAS    FUEM   184   POZ ROJO           1445    17
100   2016-01-01    COMIDAS    VTSI   693   ENVASE 1 LT         50     5
103   2016-01-01    COMIDAS    REST   73    NOPAL/PIÑA VASO     34     6
104   2016-01-01    DESAYUNOS  REST   73    NOPAL/PIÑA VASO     34     1

这为我提供了唯一的Pla项以及TotalQuantity数据的总和,但我还需要显示另外3列desc,{{1} }和Rid 我怎样才能将它们添加到我的Linq?

首先尝试

Pdv

这是我的第一次尝试,但我无法让它发挥作用,

1 个答案:

答案 0 :(得分:1)

鉴于您的pla按键分组,每个组都有一个plas列表,带有一个唯一键,并且组中的所有plas都具有相同的Pdv,Description,Riv。

您实际上可以从已经提取的密钥中获取3个字段。

{
  var pdv = item.Pla.Pdv; // etc.

  listItemPopu.Add(item.ToString());
}

但是如果你不想这样做,因为你不能将sum应用于字符串字段,你需要对它们进行FirstOrDefault。

foreach (var item in db.Pos.GroupBy(a=> a.Pla).Select(p=> new     
{
  Pla = p.Key, 
  Pdv = p.Select(a => a.Pdv).FirstOrDefault(),
  Nombre = p.Select(a => a.Description).FirstOrDefault(), 
  Rid = p.Select(a => a.Rid).FirstOrDefault(), 
  Quantity = p.Sum(q=>q.Cantidad), 
  Total= p.Sum(x=>x.Total)
}))

{
  listItemPopu.Add(item.ToString());
}

如果您的3个字段来自广告本身,您也可以将其从密钥开始。

foreach (var item in db.Pos.GroupBy(a=> a.Pla).Select(p=> new     
{
  Pla = p.Key, 
  Pdv = p.Key.Pdv,
  Nombre = p.Key.Description, 
  Rid = p.Key.Rid, 
  Quantity = p.Sum(q=>q.Cantidad), 
  Total= p.Sum(x=>x.Total)
}))

{
  listItemPopu.Add(item.ToString());
}