使用Linq在C#中将表格转换为添加更多列
使用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
问题的出现原因是代码编写错误,定义了一个名为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
值进行求和。通过这些修改,就可以正确地将一个表转换为添加更多列的形式。