Да, это возможно.
Во-первых, .Include
выполняет левое внешнее соединение, используя навигационное свойство , через которое вы проходите.
Вот как выЯвно выполнит LEFT JOIN между Student и StudentDescription :
var query = from s in ctx.Students
from sd in s.StudentDescriptions.DefaultIfEmpty()
select new { StudentName = s.Name, StudentDescription = sd.Description };
Как вы можете видеть, он выполняет JOIN на основе ассоциации сущностей между Студенты и Студенческие описания .В вашей модели EF у вас должно быть навигационное свойство под названием StudentDescription в вашей сущности Student .Приведенный выше код просто использует это для выполнения объединения и по умолчанию, если он пуст.
Код в основном идентичен .Include
.
Пожалуйста, не путайте с LEFTJOIN vs LEFT OUTER JOIN.
Это одно и то же.
Ключевое слово "OUTER" необязательно, я верюсуществует для совместимости с ANSI-92.
Просто .Include
всего, что вам нужно в вашем запросе:
using (var ctx = new TrainingContext())
{
studentDo = ctx.Students
.Include("ClassRooms")
.Include("StudentDescriptions")
.Where(x=>x.StudentID==studentId)
.Select(x => new StudentDto
{
StudentId = x.StudentId,
StudentName = x.StudentName
StudentDescription = x.StudentDescription.Description
})
.SingleOrDefault();
}
По сути, убедитесь, что все ваши FK выражены как навигационные свойства в вашей модели,тогда, если это так, вам не нужно делать никаких соединений.Любые отношения, которые вам требуются, могут быть выполнены с .Include
.