我有 4 個表和 4 個對 DB 的呼叫以從每個表中獲取資訊。試圖使其更優化并在 1 次通話中獲得所有 4 個物體。這是我當前的代碼
var teacher = await Teachers
.Where(t => t.Id == teacherId)
.FirstOrDefaultAsync(cancellationToken);
var student = await Students
.Where(s => s.Teacher == teacher)
.FirstOrDefaultAsync(cancellationToken);
var studentGrade = await StudentGrades
.Where(s => s.StudentId == student.Id)
.ToListAsync(cancellationToken);
var studentPlace = await StudentPlaces.
.Where(sp => sp.Id == student.StudentPlaceId)
.FirstOrDefaultAsync(cancellationToken);
有沒有辦法在一個電話中獲得所有這 4 個物體?
學生表與教師具有一對一的關系。我試圖做連接,但它看起來很丑。我有太多的嵌套物件。
var result= await Students.
.Join(Teachers, u => u.Teacher, e=>e, (student, teacher) => new { student, employee })
.Join(StudentGrades, u=>u.student.Id, up=>up.StudentId, (student, studentGrade) => new { student, studentGrade})
.Join(StudentPlaces, up=>up.student.student.Id, upr=>upr.Id, (student, studentPlace) => new { student, studentPlace})
.Where(x => x.student.student.teacher.Id == teacherId)
.FirstOrDefaultAsync(cancellationToken);
uj5u.com熱心網友回復:
您可以通過使用此查詢來實作此目的,但您必須在這些表與導航屬性之間建立物理關系。我假設 Student 有 StudentGrades 的集合,Student 有 StudentPlaces 的集合,這種關系是你可以使用的。
var teacher = await Teachers
.Include(x => x.Students)
.ThenInclude(x => x.StudentGrades)
.Include(x => x.Students)
.ThenInclude(x => x.StudentPlaces)
.Where(t => t.Id == teacherId)
.FirstOrDefaultAsync(cancellationToken);
包括部分正在獲取與教師相關的相關導航屬性,并且您已經說過教師與學生鏈接。ThenInclude 主要用于獲取子物體,例如 Student 與 Grades 和 StudentPlaces 有關系,然后您可以使用 ThenIclude 獲取這些子物體。
Linq to Sql 的附加功能
var result = await (from t in Teachers
join s in Students
on t.Id equals s.TeacherId
join g in StudentGrades
on s.Id equals g.StudentId
join p in StudentPlaces
on s.Id equals p.StudentId
where t.Id = teacherId
select new { t.TeacherName, s.StudentName }).FirstOrDefaultAsync(cancellationToken);
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/491886.html
