簡體   English   中英

如何使用 LINQ 連接多個表,包括連接表(由實體框架自動生成)

[英]How can I join multiple tables including a join-table (auto-generated by Entity Framework) using LINQ

我需要使用多個連接進行查詢,其中包括從多對多關系生成的連接表。 如果我直接查詢數據庫,它可以工作,但我需要在我的一個控制器中進行查詢,因為我沒有連接表的模型,所以我無法使用 DbSet 進行簡單的連接,我已經被困了幾個小時試圖找出它是如何工作的。

這是我在數據庫中的表:

考試

  • (PK) 標識
  • (FK) 類 ID

關系:* 到 1


課程

  • (PK) 標識

關系:1到*


班級學生

  • (PK) 類 ID
  • (PK) 學生編號

關系:* 到 1


學生

  • (PK) 標識
  • (FK) 人員 ID

關系:1比1


  • (PK) 標識


這些是我的模型:

public class Exam
{
    public int Id { get; set; }

    public short ClassId { get; set; }
    public Class Class { get; set; }
}

public class Class
{
    public Class()
    {
        this.Students = new HashSet<Student>();
    }

    public int Id { get; set; }

    public virtual ICollection<Student> Students { get; set; }
}

public class Student
{
    public Student()
    {
        this.Classes = new HashSet<Class>();
    }

    public int Id { get; set; }

    public virtual ICollection<Class> Classes { get; set; }
}

public class Person
{
    public int Id { get; set; }

    [Required]
    public string FirstName { get; set; }

    [Required]
    public string LastName { get; set; }
}

我正在嘗試獲取此查詢...

SELECT stu.Id, peo.FirstName, peo.LastName
FROM Exams AS exa
JOIN Classes AS cla
ON cla.Id = exa.ClassId
JOIN ClassesStudents AS clastu
ON clastu.ClassId = cla.Id
JOIN Students AS stu
ON stu.Id = clastu.StudentId
JOIN People AS peo
ON peo.Id = stu.PersonId
WHERE exa.Id = 1;

...在我的控制器中工作有點像:

public ActionResult CreateMark(int id)
    {
        var students = (from exams in _context.Exams
                       join classes in _context.Classes
                       on exams.ClassId equals classes.Id
                       join classesstudents in _context.ClassesStudents // that
                       on classes.Id equals classesstudents.ClassId     // part
                       join students in _context.Students               // doesn't
                       on classesstudents.StudentId equals students.Id  // work
                       join people in _context.People
                       on students.PersonId equals people.Id
                       where exams.Id == id
                       select new
                       {
                           Id = students.Id,
                           FullName = people.FirstName + " " + people.LastName
                       }).ToList();

我會非常感謝任何幫助!

編輯:

我設法使它與下面的代碼一起工作,但是有沒有辦法在一個查詢中用更少的代碼來做到這一點?

public ActionResult Create(int id)
    {
        var class = (from exa in _context.Exams
                     join cla in _context.Classes
                     on exa.ClassId equals cla.Id
                     where exa.Id == id
                     select new
                     {
                         ClassId = cla.Id,
                         Students = cla.Students
                     }).ToList();

        var classWithStudents= (from cla in class
                                from stu in cla.Students
                                select new
                                {
                                    Id = stu.Id,
                                    PersonId = stu.PersonId
                                }).ToList();

        var students = (from stu in classWithStudents
                        join peo in _context.People
                        on stu.PersonId equals peo.Id
                        select new FullNameStudentViewModel
                        {
                            Id = stu.Id,
                            FullName = peo.FirstName + " " + peo.LastName
                        }).ToList();

使用以下查詢:

var query = 
    from exams in _context.Exams
    from students in exams.Class.Students
    join people in _context.People on students.PersonId equals people.Id
    where exams.Id == id
    select new
    {
        Id = students.Id,
        FullName = people.FirstName + " " + people.LastName
    };

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM