使用Linq在C#中将表格转换为添加更多列

9 浏览
0 Comments

使用Linq在C#中将表格转换为添加更多列

我在之前的帖子中收到了非常有帮助的建议:Linq在C#中按照2个列进行分组 - 现在我正在尝试扩展它,以便我的ViewModel在视图中显示正确的样式:

我的第一个查询:

var qbt = db.Calls.GroupBy(calls => new { calls.assignedteam, calls.status })
            .Select(call => new StatusByTeamViewModel1
        {
            Team = call.Key.assignedteam,
            Status = call.Key.status,
            Number = call.Count()
        }).OrderBy(z => z.Team).ThenBy(z => z.Status);

返回结果:

Team  Number Status
ta    40     Open
ta    60     Closed
tb    58     Open
tb    40     Closed
tc    1      Open
tc    122    Closed

我想将这个表格转换为:

Team Open Closed
ta   40   60
tb   58   40
tc   1    122

我尝试了下面的查询,但是自己搞混了 - 所有的团队在每个Open/Closed列中都只显示1或0:

var qbt2 = qbt.GroupBy(x => x.Team)
          .Select(call => new StatusByTeamAllViewModel2
          {
              Team = call.Key,
              Open = qbt2.Where(it => it.Status == "Open" && it.Team==call.Key).Count(),
              Closed = qbt2.Where(it => it.Status == "Closed" && it.Team == call.Key).Count(),
          });

我也在LinqPad中尝试,但是在那里也很难让它工作。

谢谢你的帮助,

Mark

0
0 Comments

问题的出现原因是代码编写错误,定义了一个名为qbt2的变量,但在右边使用了这个变量。假设作者在右边使用的是qbt,那么这段代码中的GroupBy实现相对低效,因为它在遍历整个序列时寻找匹配的键。实际上,GroupBy已经提供了你所需要的序列元素,所以应该使用它。此外,代码中还存在另外一个错误,它在计算给定Team, Status对应的行数,而不是求和Number值。因此,正确的代码应该是:

var qbt2 = 
    qbt.GroupBy(x => x.Team)
       .Select(g => new StatusByTeamAllViewModel2 {
           Team = g.Key,
           Open = g.Where(x => x.Status == "Open").Sum(x => x.Number),
           Closed = g.Where(x => x.Status == "Closed").Sum(x => x.Number)
       });

解决方法是将代码中的错误进行修正,将变量名改为正确的qbt,并使用GroupBy的结果进行操作,而不是再次遍历整个序列。此外,还需要使用Sum方法来对Number值进行求和。通过这些修改,就可以正确地将一个表转换为添加更多列的形式。

0