【问题标题】:Group rows of a table by a column按列对表格的行进行分组
【发布时间】:2016-06-18 16:23:31
【问题描述】:

我有这张桌子:

Id  Title   BugNumber
--- ------- ---------
1    row1      224
2    row2      321
3    row3      224
4    row4      123

我想按 BugNumber 对行进行分组,并在如下视图中显示它们:

Bug 224
--------
   1 row1
   3 row3

Bug 321
-------
   2 row2

Bug 123
-------
   4 row4

型号:

public class MyTable
{
    public Guid Id {get; set;}
    public string Title {get; set;}
    public int? BugNumber {get; set;}
}

控制器:

public IActionResult MyGroupView()
{
    using(DbContext db = new DbContext())
    {
        db.MyTable.GroupBy(r => r.BugNumber);
        // ??? 
    }
}

【问题讨论】:

  • 我不是这方面的专家,但我不认为你可以通过 group by 做到这一点。 A group by 聚合数据,当您想要执行 sum、count 之类的操作时很有用...更改,您创建一个新部分。我不知道是否有任何替代方案,但请记住,获取所有数据的 1 个查询通常比获取数据子集的许多查询更好
  • @DanyKhalife 谢谢。我认为这是我问题的答案。
  • 很高兴我能提供帮助,我会将其作为答案发布,以便您将问题标记为已解决。

标签: c# asp.net-mvc entity-framework linq entity-framework-core


【解决方案1】:

是的,您必须使用GroupBy。这是如何使用两个类和一个选择查询来执行此操作的示例。

public class MyTable
{
    public int? Id {get;set;}
    public string Title {get;set;}
    public int? BugNumber {get;set;}

    public override string ToString()
    {
        return String.Format(" {0}, {1}, {2}", Id, Title, BugNumber.Value);
    }
}
public class MyTableGroup
{
    public int? BugNumber {get;set;}
    public List<MyTable> Values{get;set;}
}
var data = new List<MyTable>()
{
    new MyTable() { Id = 1, Title = "row1", BugNumber=224 },
    new MyTable() { Id = 2, Title = "row2", BugNumber=321 },
    new MyTable() { Id = 3, Title = "row3", BugNumber=224 },
    new MyTable() { Id = 4, Title = "row4", BugNumber=123 }
};
var result = new List<MyTableGroup>();
var groupResult = data.GroupBy(s => s.BugNumber);
 foreach (var group in groupResult)
 {
     result.Add(new MyTableGroup()
     {
         BugNumber = group.Key,
         Values = group.ToList()
     });
 }
//display result for console app:
result.ForEach(r => Console.WriteLine("\n key: {0}\n, Values: \n\t {1}\n", r.BugNumber, string.Join(", \n\t", r.Values)));

【讨论】:

    【解决方案2】:

    我不是这方面的专家,但我认为您无法通过 group by 做到这一点。

    A group by 聚合数据,当您想要执行SUM、COUNT、AVG 之类的操作时很有用...

    我建议您改为按bug number, id 对行进行排序。这样一来,您将拥有一批又一批具有相同错误编号的行,并且每批将按列排序 id

    然后,当您遍历您的项目时,只要错误编号发生变化,就意味着您获得了一个新批次,因此您只需创建一个新部分。

    我不知道在 C#、Linq 和 EF 的情况下是否有任何替代方案,但请记住,获取所有数据的 1 个查询通常比获取数据子集的许多查询更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-15
      • 2022-01-21
      • 2021-04-30
      相关资源
      最近更新 更多