我在数据库中有 2 个具有相同表结构的类
public class Student
{
public int SId {get; set;}
public string SName {get; set;}
public List<StudentDetail> SDetail {get; set;}
}
public class StudentDetail
{
public int StudentDetailId {get; set;}
public int StudentId {get; set;}
public int ExamId {get; set;}
public string Department {get; set;}
public string Address{get; set;}
}
数据是通过使用 StudentId 连接两个表从 SQL 中获取的。每个 StudentId 可以有多个 Student 详细信息。 现在我想填充上述 2 个类中的数据。我写了下面的代码。由于一个 id 有多个详细信息,这就是我使用 group by 的原因。
var list = dataTable.AsEnumerable()
.Select(x => new Student
{
SId = x.Field<int>("SId"),
SName = x.Field<string>("SName"),
SDetail = new List<StudentDetail>
{
new StudentDetail
{
StudentDetailId = x.Field<int>
("StudentDetailId"),
ExamId = x.Field<int>("ExamId"),
Department = x.Field<string>("Department")
}
}.ToList()
}).GroupBy(x => x.SId).Select(x =>
x.FirstOrDefault()).ToList();
但是例如对于 Id 1,如果有 2 个详细信息,则学生详细信息列表应该有 2 个记录。但是这段代码正在创建两个 Id 记录,每个记录在 Student Detail 中都有一个记录,如下所示
Id -> 1 -> SId -> 1
Id -> 1 -> SId -> 2
数据应该像下面这样创建:
Id -> 1 -> SId -> 1
-> SId -> 2
有什么帮助吗?
最佳答案
Select
方法为每条记录创建一个新学生
。对于 SDetail
字段,您创建了一个仅包含一个 StudentDetail
的列表。然后,当您按 SId
字段分组时,每个 Student
仍然只包含一个 StudentDetail
。
解决办法是先做分组。然后,您可以认为每个组代表一个 Student
,每个组的元素代表一个 StudentDetail
:
var list = dataTable.AsEnumerable()
.GroupBy(rec => rec.Field<int>("SId"))
.Select(gr => new Student
{
SId = gr.Key,
SName = gr.First().Field<string>("SName"),
SDetail = gr.Select(detail => new StudentDetail
{
StudentDetailId = detail.Field<int>("StudentDetailId"),
ExamId = detail.Field<int>("ExamId"),
Department = detail.Field<string>("Department")
}).ToList()
}).ToList();
GroupBy
方法的另一个重载结合了 GroupBy
和 Select
:
var list = dataTable.AsEnumerable()
.GroupBy(rec => rec.Field<int>("SId"),
(key, gr) => new Student
{
SId = key,
SName = gr.First().Field<string>("SName"),
SDetail = gr.Select(detail => new StudentDetail
{
StudentDetailId = detail.Field<int>("StudentDetailId"),
ExamId = detail.Field<int>("ExamId"),
Department = detail.Field<string>("Department")
}).ToList()
}).ToList();
关于c# - 从单个数据表 c# 填充类的嵌套列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53936921/