Увы, вы забыли показать нам свои занятия. Если вы следовали первым правилам кода инфраструктуры сущностей, у вас будут классы, подобные следующим:
class Department
{
public int Id {get; set;}
...
// Every department has zero or more Students (one-to-many)
public virtual ICollection<Student> Students {get; set;}
}
class Student
{
public int Id {get; set;}
...
// every Student belongs to exactly one department, using foreign key
public int DepartmentId {get; set;}
public virtual Department Department {get; set;}
}
А твой DbContext
class UniversityContext : DbContext
{
public DbSet<Department> Departments {get; set;}
public DbSet<Student> Students {get; set;}
}
Это все, что нужно знать Entity Framework, чтобы идентифицировать ваши таблицы, столбцы в таблицах и отношение «один ко многим» между таблицами
Примечание: в рамках сущности столбцы в таблице представлены
не виртуальные свойства. Виртуальные свойства представляют отношения
между столами
Виртуальные свойства делают вашу жизнь намного проще, потому что вам больше не нужно делать групповые объединения. Просто используйте виртуальные коллекции, структура сущности переведет это в правильные объединения.
Я хочу показать список с DepartmentName для каждого StudentName,
var result = universityDbContext.Students
.Where(student => ...) // only if you don't want all Students
.Select(student => new
{
// select only the properties you plan to use
Id = student.Id,
StudentName = student.Name,
DepartmentName = student.Department.Name,
});
Поскольку вы использовали student.Department
, структура сущностей знает, что необходим SQL join
.
Если вы хотите плоское соединение SQL, начните со стороны «многие» и используйте
виртуальная собственность в сторону «один». Если вы хотите групповое объединение, начните
с «одной» стороной и использовать виртуальную ICollection для «многих»
сторона.
Вы хотели плоское соединение, но если бы вы хотели Departments with their Students
, вы бы сделали что-то вроде:
var result = myDbContext.Departments
.Where(department => ...) // if you don't want all departments
.Select(department => new
{
// select only the properties you plan to use
Id = department.Id,
Name = department.Name,
StudentsWithHighGrades = department.Students
.Where(student => student.Grade >= ...)
.Select(student => new
{
Id = student.Id,
Name = student.Name,
Grade = student.Grade,
...
})
.ToList();
});