You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:26:50