var result = dbo.Projects
// you only want the top projects:
.Where(project => project.IsTopProject == 1)
.Join(dbo.Photos // join the remaining Projects with Photos
project => project.ProjectId, // from every project take the ProjectId,
photo => photo.ProjectId, // from every photo take the ProjectId,
(project, photo) => new // when they match make one new object
{ // containing the following properties:
TaskMaster = project.TaskMaster,
Location = project.Location,
Photo = project.Photo,
});
Довольно часто люди интересуются «Лучшие проекты с их фотографиями», или «Школы со своими учениками» или «Клиенты со своими заказами». В таких случаях GroupJoin может быть более интересным.
Обычное внутреннее объединение даст вам следующую последовательность:
Project Photo
A 3
A 4
B 2
A 6
C 1
B 5
GroupJoin приведет к этому:
- Проект A с фотографиями 3, 4, 6
- Проект B с фотографиями 2, 5
- Проект C с фото 1
- В проекте D еще нет фотографий.
Помимо того, что это кажется более естественным, преимущество заключается в том, что если у вас есть проект с 1000 фотографий, вы будете передавать свойства проекта только один раз, а не 1000 раз.
Для этого рассмотрим следующее утверждение:
var result = dbo.Projects.Where(project => project.IsTopProject == 1)
.GroupJoin(dbo.Photos // GroupJoin the remaining Projects with Photos
project => project.ProjectId, // from every project take the ProjectId,
photo => photo.ProjectId, // from every photo take the ProjectId,
(project, photosOfThisProject => new // from every project with all its matching
{ // photos, make one new object
TaskMaster = project.TaskMaster,
Location = project.Location,
Photos = photosOfThisProject.ToList(),
// or if you only need some Photo properties:
ProjectId = project.ProjectId,
Photos = photosOfThisProject.Select( photo => new
{
// select the Photo properties that you plan to use
Id = photo.Id,
...
// not needed: you know the value:
// ProjectId = photo.ProjectId,
})
.ToList()
});