通过LINQ实体POCO进行分组

时间:2019-05-29 14:14:36

标签: c# list linq group-by

我有这个实体

public class Counter
    {
        public int DocEntry { get; set; }
        public int LineId { get; set; }
        public string Item { get; set; }
        public decimal Quantity { get; set; }
        public string FromWarehouse { get; set; }
        public string ToWarehouse { get; set; }
        public virtual List<Batch> batchs { get; set; }
    }

    public class Batch
    {
      public string BatchNumber { get; set; }

        public decimal Quantity { get; set; }
    }

我有列表计数,我应该基于Item值,FromWarehouse,ToWarehouse对列表中的元素进行分组,并且应该将结果与合计数量分组,然后合并批次列表,我尝试使用foreach方法,并在新列表中插入第一个元素,如果当前行反映了列表中已有元素的值,则在后续迭代中,我汇总数量并将第i个元素的Batch列表元素添加到Batch列表中-第一行,否则我添加了新行,这种方法似乎太复杂了,对linq并不是很熟练,或者在任何情况下是否有更简单的方法来管理组?

这是我的方法:

public static List<Counter> GroupBy(List<Counter> list)
        {
            List<Counter> rows = new List<Counter>();
            int i = 0;
            foreach (Counter elem in list)
            {
                if (list.First() == elem)
                {
                    rows.Add(elem);
                    i++;
                }
                else
                {

                    if (elem.Item == rows.ElementAt(i).Item &&
                        elem.FromWarehouse == rows.ElementAt(i).FromWarehouse &&
                        elem.ToWarehouse == rows.ElementAt(i).ToWarehouse)
                    {
                        rows.First().Quantity += elem.Quantity;
                        rows.First().batchs.Add(elem.batchs.First());
                    }
                    else
                    {
                        rows.Add(elem);
                        i++;
                    }
                }
            }

            return rows;
        }

这是解决方案:

public static List<Counter> GroupBy(List<Counter> list)
        {
            List<Counter> rows = new List<Counter>();

            foreach (Counter elem in list)
            {
                if (rows.Any(x=>x.Item == elem.Item &&
                        x.FromWarehouse == elem.FromWarehouse &&
                        x.ToWarehouse == elem.ToWarehouse))
                {
                    rows.First().Quantity += elem.Quantity;
                    rows.First().batchs.Add(elem.batchs.First());
                }
                else
                {
                    rows.Add(elem);
                }
            }

            return rows;
        }

1 个答案:

答案 0 :(得分:0)

让我们尝试逐步编写 Linq

“我有列表count”:

   List<Counter> count = ...

“我应该根据ItemFromWarehouseToWarehouse对列表中的元素进行分组”:

   var result = count
     .GroupBy(item => new {
        item.Item,
        item.FromWarehouse
        item.ToWarehouse 
      })

result应该与 summer quantityBatch merged 的列表分组,即您应该{{ 1}}个项目在每个 Aggregate

chunk

最后,让我们以更方便(可读)的格式表示 var result = count .GroupBy(item => new { item.Item, item.FromWarehouse item.ToWarehouse }) .Select(chunk => new { key = chunk.Key, summary = chunk.Aggregate( Tuple.Create(0m, new List<Batch>()), // initial empty (s, a) => Tuple.Create(s.Item1 + a.Quantity, // add s.Item2.Concat(a.batchs).ToList()) // merge })

result
相关问题