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

标签 c# linq lambda

我在数据库中有 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 方法的另一个重载结合了 GroupBySelect:

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/

相关文章:

C++ 对象的快速排序 vector

c# - 有没有什么插件可以代替宪兵规则插件

c# - Entity Framework 4 中的简单条件 LINQ 查询

c# - C#3.0-如何从星期一开始按星期名称订购列表?

c# - Linq 查询连接不起作用

c# - Sql to Linq 难点——group by, having

python - 从python DataFrame中的lambda函数的多个返回值创建多个列

c# - ASP.NET 开发服务器模拟 IIS6 或 IIS7?

c# - 编写此 linq 查询的更好方法是什么?

c# - Microsoft SQL Server 2014 数据库错误