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 将导致:
- 带有照片 3、4、6 的项目 A
- 项目 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()
});