LINQ двойное левое соединение - PullRequest
1 голос
/ 20 октября 2010

У меня есть класс студентов с именем, класс blogEntries с именем студента и названием записи и класс blogAssignments с именем назначения.

Я бы хотел показать ВСЕМ учащимся и вместе с ними созданные ими записи BlogEntries, название которых соответствует blogAssignments.assignmentName.

У меня есть следующий запрос LINQ, но я не могу понять, где присоединиться к blogAssignments:

var results =
                from person in HACCStudents
                join bEntry in blogEntries on person.FullName equals bEntry.AuthorFullName
                into studentBlogEntries
                from studentBlogEntry in studentBlogEntries.DefaultIfEmpty()
                orderby person.FullName
                select new { PersonName = person.FullName, 
                    BlogTitle=studentBlogEntry != null ?studentBlogEntry.Title : ""


                };

1 Ответ

3 голосов
/ 20 октября 2010

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, разбивая подзапросы на отдельные объявления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...