EDIT:
Вот тестовый пример, который я написал и который, как мне кажется, отвечает вашим требованиям с использованием LINQ to Objects:
public class Person
{
public string FullName;
}
public class BlogEntry
{
public string AuthorFullName;
public string Title;
}
public class BlogAssignment
{
public string AssignmentName;
}
public void GetStudentsWithAssignments()
{
var students = new List
{
new Person { FullName = "Bob Doe" },
new Person { FullName = "Steve Carrell" },
new Person { FullName = "John West" },
new Person { FullName = "Alice Croft" },
new Person { FullName = "Al Bean" }
};
var entries = new List
{
new BlogEntry { AuthorFullName = "Steve Carrell", Title = "100 ways to skin a cat" },
new BlogEntry { AuthorFullName = "Steve Carrell", Title = "LINQ sux arze" },
new BlogEntry { AuthorFullName = "John West", Title = "Salmon bake 2007" },
new BlogEntry { AuthorFullName = "John West", Title = "Make my day" },
new BlogEntry { AuthorFullName = "Al Bean", Title = "An inconvenient tooth" }
};
var assignments = new List
{
new BlogAssignment { AssignmentName = "Salmon bake 2007" },
new BlogAssignment { AssignmentName = "LINQ sux arze" },
new BlogAssignment { AssignmentName = "Make my day" }
};
var subquery =
from e in entries
join a in assignments on e.Title equals a.AssignmentName
select e;
var results =
from person in students
join entry in subquery on person.FullName equals entry.AuthorFullName into personEntries
from personEntry in personEntries.DefaultIfEmpty()
orderby person.FullName
select new
{
PersonName = person.FullName,
BlogTitle = personEntry == null ? "" : personEntry.Title
};
}
То, что сделало эту хитрость, так это то, что вы хотите показать всем студентам, но оставляете только присоединение к записям блога, которые соответствуют назначениям в блоге, что является внутренним объединением.
Вот почему я добавил подзапрос, который выполняет внутреннее соединение, а затем вы оставили соединение с этим подзапросом в своем основном запросе, используя синтаксис join..into, чтобы получить левую семантику внешнего соединения.
Вы можете сделать все это за один раз, но я считаю, что гораздо проще читать запросы LINQ, разбивая подзапросы на отдельные объявления.