C# 从单个数据表c填充类的嵌套列表#
我有两个类在DB中具有相同的表结构C# 从单个数据表c填充类的嵌套列表#,c#,linq,lambda,C#,Linq,Lambda,我有两个类在DB中具有相同的表结构 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
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;}
}
应按如下方式创建数据:
Id -> 1 -> SId -> 1
-> SId -> 2
有什么帮助吗?选择
方法为每个记录创建一个新学生。对于SDetail
字段,您创建一个列表,其中正好包含一个StudentDetail
。然后按SId
字段分组时,每个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();
如果需要层次结构,为什么要使用FirstOrDefault
将集合展平?删除该部分,集合将保持层次结构。
Id -> 1 -> SId -> 1
-> SId -> 2
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();
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();