如何将SQL查询数据绑定到含关联类的Student对象中?
C# 实体类数据绑定解决方案
嘿,我来帮你搞定这个数据绑定的问题!先理清楚你的类结构关系:Student继承自StudentInfo,StudentInfo包含一个Relationship类型的属性,Student自己还有一个School类型的属性。你现在的代码只给Student的基础属性赋了值,没处理嵌套的Relationship和School,而且StudentInfo里的属性其实已经通过继承在Student里了,不用单独创建StudentInfo实例。
先把你的类结构再明确下(方便对照):
public class Student : StudentInfo { public School School { get; set; } } public abstract class School { public string SchoolName { get; set; } public string SchoolAddress { get; set; } } public abstract class StudentInfo { public string StudentName { get; set; } public string StudentAge { get; set; } public string StudentGender { get; set; } public Relationship StudentRelationship { get; set; } } public abstract class Relationship { public string StudentMotherName { get; set; } public string StudentFatherName { get; set; } }
你的当前绑定代码只实例化了Student的部分属性,下面是修改后的完整代码,我会加上注释说明每一步:
private List<Student> StudentList() { var students = new List<Student>(); using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Connection"].ConnectionString)) { conn.Open(); string query = @"SELECT a.[StudentName], a.[StudentAge], a.[StudentGender], a.[StudentMotherName], a.[StudentFatherName], b.[SchoolName], b.[SchoolAddress] FROM [Student] a WITH (NOLOCK) INNER JOIN [School] b WITH (NOLOCK) ON a.[StudentID] = b.[StudentID]"; using (var cmd = new SqlCommand(query, conn)) { using (var reader = cmd.ExecuteReader()) { while (reader.Read()) { // 注意:抽象类不能直接实例化,这里需要先处理抽象类的问题(后面会说明) var relationship = new Relationship { StudentMotherName = reader["StudentMotherName"].ToString(), StudentFatherName = reader["StudentFatherName"].ToString() }; var school = new School { SchoolName = reader["SchoolName"].ToString(), SchoolAddress = reader["SchoolAddress"].ToString() }; // Student继承自StudentInfo,直接赋值继承来的属性即可 students.Add(new Student { StudentName = reader["StudentName"].ToString(), StudentAge = reader["StudentAge"].ToString(), StudentGender = reader["StudentGender"].ToString(), StudentRelationship = relationship, School = school }); } } } } return students; }
关键注意事项:
- 继承属性的处理:因为
Student继承了StudentInfo,所以Student实例本身就拥有StudentInfo的所有属性(StudentName、StudentAge等),不需要额外创建StudentInfo对象,直接给Student实例赋值这些属性即可。 - 抽象类的实例化问题:你定义的
School、StudentInfo、Relationship都是abstract抽象类,抽象类是不能直接new的!解决方法有两种:- 如果不需要这些类是抽象的,直接去掉
abstract修饰符,把它们改成普通类; - 如果必须保留抽象类,需要创建对应的具体子类,比如
public class ConcreteSchool : School { },然后在代码里实例化子类:var school = new ConcreteSchool { ... }。
- 如果不需要这些类是抽象的,直接去掉
这样就能完整把SQL查询到的所有数据绑定到对应的对象属性里了!
内容的提问来源于stack exchange,提问作者Frost Rennaisance
相关产品推荐
相关产品推荐

