我在之前的帖子中收到了非常有用的建议:Linq to group by 2 columns in C# - 我现在正在尝试对此进行扩展,以便我的 ViewModel 看起来适合 View :
我的第一个查询:
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
我正在尝试下面的查询,但我把自己弄糊涂了——如果打开/关闭列,所有团队都只显示 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,但也很难让它在那里工作。
谢谢你的帮助,
标记
最佳答案
这里的内容甚至无法编译,因为您在左侧定义了 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)
});
关于c# - 转换表以在 C# 中的 Linq 中添加更多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16793327/