c# - 转换表以在 C# 中的 Linq 中添加更多列

标签 c# linq linq-to-sql

我在之前的帖子中收到了非常有用的建议: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/

相关文章:

c# - 我可以在 Linq 查询中选择多个对象吗

c# - 查询反序列化对象

entity-framework - 在 EF Core 中,如何执行分组并选择逗号分隔值列表?

c# - 是否可以在单个查询中跟踪外键引用链?

c# - 在 IEnumerator.GetEnumerator() 中返回 IEnumerator<T>.GetEnumerator() 是否可以?

c# - 使用 protobuf.net 反序列化缺失类型

c# - 将样式与 HierarchicalDataTemplate 与 Caliburn.Micro 和 MahApps 框架一起使用

c# - 如果队列未锁定,多线程的性能与全局队列的长度有关?

c# - 跨不同 Linq-to-SQL 上下文的实体相等性

linq - 当字段需要首先解析时,如何在 linq 查询中进行过滤?