填充具有另一个类作为属性的类

时间:2015-04-20 11:44:26

标签: c# class oop design-patterns properties

我的Windows窗体应用程序中有两个类。 我们说StudentStudentDetailsStudentDetails类也是Student类的属性。

我有一个存储过程,它从数据库中的两个表中获取数据。 我需要知道这个场景通常是如何处理的,这意味着学生类通常是如何填充的。 非常感谢你的回答。 任何类似情景的链接都会很棒。

这是我的代码:

 class Student
    {
        public int StudentID { get; set; }
        public string StudentName { get; set; }
        public StudentDetails StudentDetails { get; set; }

        public Student()
        {
            this.StudentID = 0;
            this.StudentName = String.Empty;
            this.StudentDetails = new StudentDetails();
        }

    }

class StudentDetails
    {

        public int StudentDetailsID { get; set; }
        public string Address { get; set; }
        public int Height { get; set; }
        public int Weight { get; set; }

        public StudentDetails()
        {
            this.StudentDetailsID = 0;
            this.Address = String.Empty;
            this.Height = 0;
            this.Weight = 0;

        }

    }

以下课程有一个填写学生班级的功能( FillStudent()

 Class StudentAssembler
        {

            public List<Model.Student> FillStudent()
            {
                List<Model.Student> StudentCollection = new List<Model.Student>();
                Model.Student StudentDTO = new Model.Student();
                try
                {
                    using (Model.dbConnection dbconnection = new Model.dbConnection(Utilities.SqlConnStr))
                    {

                        SqlDataReader dr;
                        SqlCommand command = new SqlCommand("GetStudents", dbconnection.connection);
                        command.CommandType = CommandType.StoredProcedure;
                        dbconnection.OpenConn();
                        dr = command.ExecuteReader();
                        while (dr.Read())
                        {
                            StudentDTO.StudentID = dr[0] == DBNull.Value ? 0 : (int)dr[0];
                            StudentDTO.StudentName = dr[1] == DBNull.Value ? String.Empty : (String)dr[1];

//this is the part that i need to know how is it usually handled

//StudentDTO.StudentDetails = how to fill out this part ???
                                StudentCollection.Add(StudentDTO);
                            }

                            return StudentCollection;
                        }
                    }
                    catch (Exception)
                    {
                        return null;
                    }
                }
            }

修改

存储过程代码

select s.StudentID,s.StudentName,sd.StudentDetailsID,sd.Address,
sd.Height,sd.Weight
from Student s,StudentDetails sd
where s.StudentID = sd.StudentID

3 个答案:

答案 0 :(得分:1)

考虑存储过程查询,您可以简单地:

StudentDTO.StudentDetails = new StudentDetails
{
    StudentDetailsID = dr[2] == DBNull.Value ? 0 : (int)dr[2],
    Address = dr[3] == DBNull.Value ? String.Empty : (String)dr[3],
    ...
};

答案 1 :(得分:0)

你有两个选择

1:一个单独的sproc(或sql),用于通过studentID从学生详细信息表中获取信息。每个学生打电话给

2:加入sproc / sql中的学生详细信息表,并用同一行数据填充

选项1:通常更清洁,更可重复使用。我会说这应该是你的第一个方法。

但是,如果你需要检索很多学生,选项2会快得多。因为它只需要一次调用db。

此外,您似乎在学生和学生之间有一对一的关系,因此没有理由不使用选项2.如果您有一个学生的许多详细信息,您仍然可以使用选项2,跳过重复的学生信息。即使您返回的数据多于sql

所需的数据,这通常也是最好的方法

答案 2 :(得分:0)

您可以创建单独的函数来获取学生和学生详细信息记录。 这样,您就可以在代码中的任何位置重复使用这些功能。

E.g。对于student,你可以拥有这样的功能

  public Student CreateStudent(IDataRecord iDataRecord)
    {
        Student stud = new Student();
        stud.Id = GetValue<int>(iDataRecord, "Id");
        stud.Name = GetValue<string>(iDataRecord, "Name");
        return stud;
    }

对于studentDetails,创建一个这样的函数:

      public StudentDetails CreateStudentDetails(IDataRecord iDataRecord)
    {
        StudentDetails studDetails = new StudentDetails();
        studDetails.Id = GetValue<int>(iDataRecord, "Id");
        studDetails.Address = GetValue<string>(iDataRecord, "Address");
        studDetails.Height = GetValue<string>(iDataRecord, "Height");
        studDetails.Weight = GetValue<string>(iDataRecord, "Weight");
        return studDetails;
    }

然后,在您的FillStudent方法中,只需致电:

Student student=this.CreateStudent(dr);
student.StudentDetails=this.CreateStudentDetails(dr);

请注意,此代码仅供参考。您可以进一步重新考虑此代码,将其单独创建工厂类。