如何使用 linq to sql 连接两个表以检索 asp.net 中的数据

How to join two tables using linq to sql to retrieve data in asp.net

我正在尝试使用 Linq 将两个表连接到 sql,但是

我遇到了错误

Object reference not set to an instance of an object

我认为是因为 FirstOrDefault() 方法,我更改了它但错误仍然存​​在 !!!

这是我的代码:

        LblCourseCode.Text = Request.QueryString["CourseCode"];

        try
        {

            var qry = from cs in db.Courses

                      join inst in db.Instructors
                      on cs.CourseId equals inst.CourseId
                      where cs.CourseCode == "@CourseCode"


                      select new 
                      {
                          //cs,
                          //inst


                          cs.CourseCode,
                          cs.CourseName,
                          cs.CourseAbout,
                          cs.CourseObjectives,
                          cs.CourseLearningOut,

                          inst.InstructorName,
                          cs.CourseImgUrl,
                          ////instr = from ins in db.Instructors
                          ////        select new { ins.InstructorName }

                      };

            //LblCourseCode.Text = qry.courseCode;
            LblCourseName.Text = qry.FirstOrDefault().CourseName;
            LblCourseAbout.Text = qry.FirstOrDefault().CourseAbout;
            LblObjectives.Text = qry.FirstOrDefault().CourseObjectives;
            LblLearningOutcomes.Text = qry.FirstOrDefault().CourseLearningOut;
            LblCourseInstructore.Text = qry.FirstOrDefault().InstructorName;

            ImageCourseAb.ImageUrl = qry.FirstOrDefault().CourseImgUrl;

        } 
        catch(Exception ex)
        {
            LblErr.Text = ex.Message;
        }

    }

要处理集合为空的情况,您应该在查询之前添加检查:

if (qry.Any())
{
        LblCourseName.Text = qry.FirstOrDefault().CourseName;
        LblCourseAbout.Text = qry.FirstOrDefault().CourseAbout;
        LblObjectives.Text = qry.FirstOrDefault().CourseObjectives;
        LblLearningOutcomes.Text = qry.FirstOrDefault().CourseLearningOut;
        LblCourseInstructore.Text = qry.FirstOrDefault().InstructorName;

}

您可以使用嵌套的 foreach 循环来代替 Join,它不是很漂亮,但也许可以帮助您隔离问题:

var qry = new List<object>();
foreach (var cs in db.Courses.Where(c => c.CourseCode == "@CourseCode"))
{
    foreach (var inst in db.Instructors)
    {
        if (inst.CourseId == cs.CourseId)
        {
            qry.Add(new 
            {
                cs.CourseCode,
                cs.CourseName,
                cs.CourseAbout,
                cs.CourseObjectives,
                cs.CourseLearningOut,
                inst.InstructorName,
                cs.CourseImgUrl,
            }); 
        }
    }
}