在数据集中导航多对多表关系(优化)

时间:2010-07-18 11:12:25

标签: c# ado.net dataset

我有一个包含大学数据库表格的数据集, 这些表中的两个(实际上更多)包含多对多的关系, 特别是我有一个,

学生表(包含有关学生的信息) 课程表(包含有关课程的信息) TakesCourses 表(这是学生课程表之间的中间表,每个学生都可以有很多课程)

我想输入“学生ID”,并根据 TakesCourses 表中的记录从课程表中获取所有记录。

我的代码 工作 ,内容如下:

string stdInfo = string.Empty;

DataRow[] drStudent = null;
DataRow drCourses = null;
DataRow[] drStdCrs = null;

drStudent = universityDS.Tables["Students"]
    .Select(string.Format("StudentID='{0}'", txtStudentID.Text));

stdInfo += string.Format("Student {0} {1}:\nTaking Courses:",
    drStudent[0]["FirstName"].ToString().Trim(),
    drStudent[0]["LastName"].ToString().Trim());

drStdCrs = drStudent[0].GetChildRows(
    universityDS.Relations["FK_TakesCourses_Students"]);

//Can I optimize here? Is there a better way to code this
if (drStdCrs.Length > 0)
{
    for (int i = 0; i < drStdCrs.Length; i++)
    {
        drCourses = drStdCrs[i].GetParentRow(
            universityDS.Relations["FK_TakesCourses_Courses"]);

        stdInfo += string.Format("\nCourse: {0}",
            drCourses["CourseName"]);
    }               
}

MessageBox.Show(stdInfo);

我的问题是,如何在评论后优化代码? 是否有更好的方式来写这个?

(注意:我是一名正在恢复的开发人员,试图刷新我的技能)

2 个答案:

答案 0 :(得分:1)

如果您正在使用的.NET框架版本(或基于项目能够使用)支持LINQ2SQL,我 HIGHLY 建议您花时间学习LINQ,因为它会让您的生活变得更好在处理SQL和每天用.NET编码时都要容易一千倍。

在这个时代,我会避免使用内联SQL,除非它是你唯一的选择,因为它在大多数场所经常会被处死:¬(。

答案 1 :(得分:0)

我完全同意JDoig。下面是使用LINQ to SQL时代码的外观示例:

string stdInfo = string.Empty;
string studentId = txtStudentID.Text;

using (var db = new CourseDataContext())
{
    Student student = (
        from student in db.Students
        where student.StudentID == studentId
        select student).Single();

    stdInfo += string.Format("Student {0} {1}:\nTaking Courses:",
        student.FirstName, student.LastName);

    var courseNames =
        from taken in student.TakesCourses
        select taken.Course.CourseName;

    foreach (string courseName in courseNames)
    {
        stdInfo += string.Format("\nCourse: {0}", courseNames);
    }
}

MessageBox.Show(stdInfo);

正如您将看到,它显示代码的代码要少得多,并且在显示代码意图方面做得更好。