根据分组更新记录

时间:2017-03-21 03:42:14

标签: c# .net linq group-by

我有一个行列表:

 public class Row 
{
    public string SINo{ get; set; }
    public string AccountName { get; set; }
    public string ProductCode { get; set; }
    public int Quantity { get; set; }
    public int FreeGoods { get; set; }
    ...

}

和这些记录:

  SINo          AccountName       ProductCode       Quantity       FreeGoods
S145144       DUMAN, MARILYN M.    13002154            8              
S145144       DUMAN, MARILYN M.    13002154            2
S144413        CRUZ, ISABELLA      13002154            2
S145151        CASTRO, MARIO C.    13002154            5
S145151        CASTRO, MARIO C.    13002154            1
S142058      RILLERA, FREDILYN B.  13002155            10
S142058      RILLERA, FREDILYN B.  13002155            2

如您所见,原始订单的下一行具有相同的记录但数量不同。这意味着数量另一行是FreeGoods。但是在其他一些行中,可能会有记录没有FreeGoods的成功记录。我对linq不太了解。我如何分组并选择它来制作这样的东西?

  SINo          AccountName       ProductCode       Quantity      FreeGoods
S145144       DUMAN, MARILYN M.    13002154            8             2
S144413        CRUZ, ISABELLA      13002154            2
S145151        CASTRO, MARIO C.    13002154            5             1
S142058      RILLERA, FREDILYN B.  13002155            10            2

每条记录中没有唯一属性。例如,属性SINo,AccountName,产品可以在每一行中重复。

3 个答案:

答案 0 :(得分:0)

我建议您添加一个新列hasFreeGoods,因为它将为您提供更清晰的解决方案

关于当前结构。我假设每个产品最多有两条记录

var groups=from r in Rows group r by new {
r.ProductCode,
r.SINo,
r.AccountName
} into gr;

groups.select(g => new {
g.Key.ProductCode,
g.Key.SINo,
g.Key.AccountName,
Quantity=g.First().Quantity,
FreeGoods =g.Count()>1 ? g.Last().Quentity :0   
})

答案 1 :(得分:0)

按照Linq查询给出我预期的结果。希望它会帮助你

List<Row> list = new List<Row>();
//add data to list
//then execute this linq query
list.GroupBy(x => x.SINo).Select(y=> new Row
            {
                AccountName = y.First().AccountName,
                ProductCode = y.First().ProductCode,
                Quantity = y.First().Quantity,
                SINo = y.First().SINo,
                FreeGoods = y.Count() > 1 ? y.Last().Quantity : 0
            });

答案 2 :(得分:0)

你可以试试这个。与之前的答案略有不同:

 var result = list.GroupBy(p => p.SINo,                             
                             (key, g) => new { 
                             SINo = g.Key,
                             ProductCode = g.First().ProductCode,
                             AccountName = g.First().AccountName,
                             Quantity = g.First().Quantity,
                             FreeGoods = g.Count() > 1 ? g.Last().Quantity : 0 
                             }).ToList();