Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从单个数据表c填充类的嵌套列表#_C#_Linq_Lambda - Fatal编程技术网

C# 从单个数据表c填充类的嵌套列表#

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

我有两个类在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 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();