C# 将读取器转换为类的列表

C# 将读取器转换为类的列表,c#,sqldatareader,C#,Sqldatareader,我有一节课 Class Student { Int studentId, List<ClassB> Books } Class Book { Int bookId, List<int> pages } 我想代表这个学生班级 我能按学生ID分组,但不能拿到书 静态void Main(字符串[]参数) { var res = GetStudents(); var result = res.AsEnumer

我有一节课

Class Student
{
    Int studentId,
    List<ClassB> Books 
}

Class Book
{
    Int  bookId,
    List<int> pages
}
我想代表这个学生班级

我能按学生ID分组,但不能拿到书 静态void Main(字符串[]参数) {

        var res = GetStudents();
        var result = res.AsEnumerable()
    .GroupBy(r => new { r.StudentId,r.IsPassed })
    .Select(c =>
            new Student()
            {
                IsPassed = c.Key.IsPassed,
                StudentId = c.Key.StudentId,

            }).ToList();



    }

private static List<Student> GetStudents()
{
    string connStr = ConfigurationManager.AppSettings["Conn"];
    List<Student> students = new List<Student>();
    SqlConnection conn = new SqlConnection(connStr);
    conn.Open();

    SqlCommand command = new SqlCommand("Select * from Students", conn);
    using (SqlDataReader reader = command.ExecuteReader())
    {
        while (reader.Read())
        {
            var StudentId = Convert.ToInt32(reader["StudentId"]);
            var BookId = Convert.ToInt32(reader["BookId"]);
            var IsPassed = Convert.ToBoolean(reader["IsPassed"]);
            var PageNUmbers = reader["PageNumber"].ToString().Split(',').Select(t => Convert.ToInt32(t)).ToList();
            List<Book> books = new List<Book>();
            books.Add(new Book() { BookId = BookId, PageNumber = PageNUmbers });
            students.Add(new Student() { StudentId = StudentId, Books = books, IsPassed = IsPassed });
        }
    }
    return students;

}
var res=GetStudents();
var result=res.AsEnumerable()
.GroupBy(r=>new{r.StudentId,r.IsPassed})
.选择(c=>
新生()
{
IsPassed=c.Key.IsPassed,
StudentId=c.Key.StudentId,
}).ToList();
}
私有静态列表GetStudents()
{
字符串connStr=ConfigurationManager.AppSettings[“Conn”];
列出学生=新建列表();
SqlConnection conn=新的SqlConnection(connStr);
conn.Open();
SqlCommand=newsqlcommand(“从学生中选择*”,康涅狄格州);
使用(SqlDataReader=command.ExecuteReader())
{
while(reader.Read())
{
var StudentId=Convert.ToInt32(读卡器[“StudentId]”);
var BookId=Convert.ToInt32(读卡器[“BookId]”);
var IsPassed=Convert.ToBoolean(读卡器[“IsPassed”]);
var PageNUmbers=reader[“PageNUmbers”].ToString().Split(',).Select(t=>Convert.ToInt32(t)).ToList();
列表书籍=新列表();
添加(新书(){BookId=BookId,PageNumber=PageNUmbers});
Add(new Student(){StudentId=StudentId,Books=Books,IsPassed=IsPassed});
}
}
留学生;
}

页面不是集合,它只是一个整数。每个学生都有一个书籍列表,每本书都有一个Id和一个页码属性

Class Student
{
Int studentId,
List<Book> Books 
}

Class Book
{
Int  bookId,
Int numberOfPages
}
班级学生
{
国际学生,
书目
}
课堂用书
{
国际图书编号,
整数页数
}

您可以在
Linq
的帮助下执行此操作

DataTable dt = new DataTable();
dt.Load(reader);

var result = dt.AsEnumerable()
    .GroupBy(r=>r.Field<int>("StudentId"))
    .Select(c=> 
            new Student() 
            {
                studentId = c.Key, 
                Books = c.GroupBy(s=>s.Field<int>("bookId"))
                    .Select(b=> 
                            new Book() 
                            {
                                bookId = b.Key, 
                                pages = b.Select(s=>s.Field<int>("Page")).ToList() 
                            }).ToList()
            }).ToList();
请注意,如果您说
studentId,bookId
组合是唯一的,您甚至可以简化这个答案


更新了

使用
while(reader.read()){//code to map}
“我有一个类”-在我看来像两个类;“你想把这些数据合并成一个列表吗?”提姆:“对不起,我的Bad你应该阅读。我想考虑页码。你的书的页数是多少?我的书类没有页数,页码都一样,因为两者都被认为是一个定义页数的整数。”因为第一册有300页。第二册是250。嘿,我刚修改了我的问题。你能告诉我应该怎么做吗。页码将由逗号分隔。pages不是一个
列表
?它是一个列表,但从数据库中,我将使用逗号分隔。嘿,我们可以不使用DataTable来执行此操作吗。只需从读取器和分组中首先分配变量?这是可能的,看看这个
DataTable dt = new DataTable();
dt.Load(reader);

var result = dt.AsEnumerable()
    .GroupBy(r=>r.Field<int>("StudentId"))
    .Select(c=> 
            new Student() 
            {
                studentId = c.Key, 
                Books = c.GroupBy(s=>s.Field<int>("bookId"))
                    .Select(b=> 
                            new Book() 
                            {
                                bookId = b.Key, 
                                pages = b.Select(s=>s.Field<int>("Page")).ToList() 
                            }).ToList()
            }).ToList();
var result = dt.AsEnumerable()
            .GroupBy(r=>r.Field<int>("StudentId"))
            .Select(c=> 
                    new Student() 
                    {
                        studentId = c.Key, 
                        Books = c.GroupBy(s=>s.Field<int>("bookId"))
                            .Select(b=> 
                                    new Book() 
                                    {
                                        bookId = b.Key, 
                                        pages = b.SelectMany(p=>p.Field<string>("Page").Split(',').Select(int.Parse)).ToList() 
                                    }).ToList()
                    }).ToList();