C# 在C中转换表以在Linq中添加更多列
我在前一篇文章中收到了非常有用的建议:-我现在正在尝试扩展这一点,以便我的ViewModel与视图的外观保持一致: 我的第一个问题是:C# 在C中转换表以在Linq中添加更多列,c#,linq,linq-to-sql,C#,Linq,Linq To Sql,我在前一篇文章中收到了非常有用的建议:-我现在正在尝试扩展这一点,以便我的ViewModel与视图的外观保持一致: 我的第一个问题是: var qbt = db.Calls.GroupBy(calls => new { calls.assignedteam, calls.status }) .Select(call => new StatusByTeamViewModel1 { Team = call.Key.assig
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,但也很难让它在LinqPad工作
谢谢你的帮助
标记这里的内容甚至不会编译,因为您在左侧定义qbt2,在右侧使用它。现在,假设您指的是右侧的qbt,那么GroupBy的实现效率相当低,然后遍历整个序列寻找匹配的键。GroupBy已经为您提供了所需的序列元素,所以请使用它。然后,排除这两个错误,您将计算与给定团队、状态对匹配的行数,而不是对给定对的数值求和。因此:
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)
});
这里的内容甚至不会编译,因为您在左侧定义qbt2,在右侧使用它。现在,假设您指的是右侧的qbt,那么GroupBy的实现效率相当低,然后遍历整个序列寻找匹配的键。GroupBy已经为您提供了所需的序列元素,所以请使用它。然后,排除这两个错误,您将计算与给定团队、状态对匹配的行数,而不是对给定对的数值求和。因此:
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)
});