我有这张桌子:
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);
// ???
}
}
答案 0 :(得分: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)));
答案 1 :(得分:0)
我不是这方面的专家,但我不认为你可以通过小组来做到这一点。
通过聚合数据进行分组,在您想要执行SUM
,COUNT
,AVG
...
我建议您按bug number, id
订购行。这样,您将拥有一个接一个地具有相同错误编号的批次行,并且每个批次将按列id
然后,当您遍历项目时,只要错误编号发生变化,就意味着您获得了一个新批处理,因此您只需创建一个新部分。
我不知道C#,Linq和EF是否有针对您的案例的任何替代方案,但请记住,获取所有数据的1个查询通常比获取其子集的许多查询更好。