列表的分组依据和总和是最终的汇总结果

时间:2018-03-16 02:33:30

标签: c# asp.net entity-framework linq arraylist

表数据是: 信息 ----------------------------------------------- num name年龄费用N成本组 1个20 2 b 21 InfoDetail ----------------------------------------------- num expenseN cost group 1 001 10.00 x 2 001 20.00 x 3 002 20.00 x 4 003 30.00 y 这是代码: 公共类_infoRepository {     公共字符串名称{get;组; }     public int age {get;组; }     公共字符串费用N {get;组; }     公共小数成本{get;组; }     公共字符串组{get;组; } } 公共类_infoDetailRepository {     公共字符串费用N {get;组; }     公共小数成本{get;组; }     公共字符串组{get;组; } } 列表与LT;信息> result = new List< Info>(); var listInfoDetail = _infoDetailRepository.Query(p => p.group ==" x")。ToList(); var info1 = _infoRepository.Query(p => p.name =" a")。FirstOrDefault(); for(int i = 0; i< listInfoDetail.Count; i ++) {     result.Add(新信息()     {         name = info1.name,         age = info1.age,         expenseN = listInfoDetail [i] .expenseN,         cost = listInfoDetail [i] .cost,         group = listInfoDetail [i] .group     }); } var info2 = _infoRepository.Query(p => p.name =" b")。FirstOrDefault(); for(int i = 0; i< listInfoDetail.Count; i ++) {     result.Add(新信息()     {         name = info2.name,         age = info2.age,         expenseN = listInfoDetail [i] .expenseN,         cost = listInfoDetail [i] .cost,         group = listInfoDetail [i] .group     }); } 返回结果; 运行此代码后,结果变量的结果如下: 结果 -------------------------------------------------- num name年龄费用N成本组 1 a 20 001 10.00 x 2 a 20 001 20.00 x 3 a 20 002 20.00 x 4 b 21 001 10.00 x 5 b 21 001 20.00 x 6 b 21 002 20.00 x 然而,这不是我想要的结果,我预期的结果是这样的: 结果 -------------------------------------------------- num name年龄费用N成本组 1 a 20 001 30.00 x 2 a 20 002 20.00 x 3 b 21 001 30.00 x 4 b 21 002 20.00 x 毕竟,我想分组并对结果变量求和,以给出我想要的结果。有人请在这种情况下帮助我,谢谢

2 个答案:

答案 0 :(得分:1)

var listInfoDetail = _infoDetailRepository.Query(p => p.group == "x").ToList();

InfoDetail表中有group == "x"个条目。因此listInfoDetail有3个项目。你这样做了两次,所以你最终得到6.行为是预期的。

  

我想分组并对结果变量求和以给出我想要的结果

如果您不想对逻辑进行更改,您可以获取结果变量并执行类似的操作,然后按expenseNname进行分组,然后对{ {1}}

cost

但这对LINQ的使用非常低效。您应该寻求改进以下内容:

  1. 重复的代码。您正在为var resultGrouped = result .GroupBy(x => new { x.expenseN, x.name }) .Select(y => new Info() { name = y.Key.name, age = y.FirstOrDefault().age, expenseN = y.Key.expenseN, cost = y.Sum(z => z.cost), group = y.FirstOrDefault().group }).ToList(); p.name = "a"
  2. 重复相同的逻辑
  3. 不必要的p.name = "b"。您可以使用ToList()
  4. 加入两个枚举,而不是存储listInfoDetailinfo1

    最终所有这些代码都可以使用一个链式LINQ语句进行存档,效率更高,更短。

答案 1 :(得分:1)

以下代码将有助于您简化现有代码并帮助您获得所需的结果。

var result = from p in InfoDetails
             where p.groups == "x"
             group p by new { p.expenseN } into g
             from c in Info
             orderby c.name, g.FirstOrDefault().expenseN
             select new
             {
               name = c.name,
               age = c.age,
               expenseN = g.FirstOrDefault().expenseN,
               cost = g.Sum(x=>x.cost),
               groups = g.FirstOrDefault().groups
             };

var result = InfoDetails.Where(x=>x.groups=="x").GroupBy(x=>x.expenseN).SelectMany(t1 => Info.Select(t2 => new {  
              name = t2.name,
              age = t2.age,
              expenseN = t1.FirstOrDefault().expenseN,
              cost = t1.Sum(x=>x.cost),
              groups = t1.FirstOrDefault().groups
              })).OrderBy(x=>x.name).ThenBy(x=>x.expenseN);