在C#代码中使用LINQ读取ICollection数据

3

我需要使用Linq查询获取每个记录实例的Icollection数据以及其他数据,我已经正确地完成了这项工作。

课程模型

public partial class Course
{
    public Course()
    {
        this.StudentCourses = new HashSet<StudentCourse>();
    }

    public int CourseID { get; set; }
    public string Title { get; set; }

    public virtual ICollection<StudentCourse> StudentCourses { get; set; }
}

Student Model

   public partial class Student
{
    public Student()
    {
        this.StudentCourses = new HashSet<StudentCourse>();
    }

    public int StudentID { get; set; }
    public string Name { get; set; }

    public virtual ICollection<StudentCourse> StudentCourses { get; set; }
}

学生课程模型

public partial class StudentCourse
{
    public int StudentCourseID { get; set; }
    public int StudentID { get; set; }
    public int CourseID { get; set; }

    public virtual Course Course { get; set; }
    public virtual Student Student { get; set; }
}

方法阅读记录

   public void readStudents()
    {
        using (var db2 = new MyDbContext())
        {
            List<Student> _studentRead = new List<Student>();

            _studentRead = (from b in db2.Students
                            orderby b.StudentID
                            select b).ToList() ;

        }
    }

class model

 public partial class Student
{
    public Student()
    {
        this.StudentCourses = new HashSet<StudentCourse>();
    }

    public int StudentID { get; set; }
    public string Name { get; set; }

    public virtual ICollection<StudentCourse> StudentCourses { get; set; }
}

第三部分问题

现在我得到了正确的结果,即可以使用以下语句查看学生和他们注册课程ID的列表:

  using (var db2 = new MyDbContext())
        {
            List<Student> _studentRead = new List<Student>();

            _studentRead = (from _student in db2.Students.Include(r=>r.StudentCourses)        
                            select _student).ToList();
        }

现在,如果我想像下面的图表所示那样读取courseIDs,我该如何将课程标题包含到我的linq语句中呢?

问题是什么?你说出你需要什么,而不是你卡在哪里。 - Gert Arnold
1个回答

2
如果您在加载学生对象时尝试加载StudentCourse集合,您可以使用Include扩展方法。
public void LoadStudents()
{
  using (var db2 = new MyDbContext()
  {
    //Lambda Linq
    var studentList = new List<Student>();
    studentList = db2.Students
                     .Include(s => s.StudentCourses)
                     .OrderBy (s => s.StudentId)
                     .ToList();

    //Comprehension Linq 
    var compList = new List<Student>();
    compList = (from s in db2.Students.Include(r => r.StudentCourses)
               OrderBy s.StudentId
               Select s).ToList();
  }
}

这将明确告知上下文在从上下文加载每个学生对象时加载集合。该扩展方法位于System.Data.Entity命名空间中。
更多信息可以在此处找到: https://msdn.microsoft.com/en-us/data/jj574232.aspx 更新1 - 显示加载多层依赖对象。
public void LoadStudents()
{
  //Lambda Linq
  var lambdaList = db2.Students
                      .Include(s => s.StudentCourses.Select(sc => sc.Course))
                      .OrderBy(s => s.StudentId)
                      .ToList();

 //Comprehension Linq
 var compList = (from student in db2.Students.Include(s => s.StudentCourse.Select(sc => sc.Course)
                 OrderBy student.StudentId
                 Select student).ToList(); 
}

我遇到了以下错误:无法将 lambda 表达式转换为类型“string”,因为它不是委托类型。 - K.Z
请确保您已经引用了实体框架并添加了使用语句。否则,该函数将期望包含您想要包括的属性的字符串名称。 - Stefan William-Worrall
非常感谢,我已经成功运行了。但是如果我想要从不同的表格和不同的模型中获取课程标题,我该如何包含它呢?我已经在问题的第三部分更新了我的问题描述... - K.Z
你能否添加一个学生课程的模型和你试图包含的实体模型,以使问题更加清晰明了。谢谢。 - Stefan William-Worrall
我在我的问题中添加了学生、课程和学生课程模型,请参考上文! - K.Z
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接