Поиск по результату группового объединения - PullRequest
0 голосов
/ 05 декабря 2010

Я делаю запрос LINQ для образца базы данных Книги: http://www.codeproject.com/KB/linq/linqtutorial.aspx Извините за внешнюю ссылку, но я не знаю, как обеспечить структуру базы данных в вопросе. В настоящее время у меня есть этот запрос:

var result = from book in dataContext.Books
    join book_author in dataContext.BookAuthors
    on book.Id equals book_author.Book
    into book_authors
    join category in dataContext.BookCategories
    on book.Category equals category.Id
    select new
    {
        Book = book.Id,
        Title = book.Title,
        Category = book.Category,
        CategoryName = category.Name,
        BOOK_Authors = book_authors
        // , Author_Name = ???
};

Этот результат запроса имеет подпоследовательность BOOK_Authors: int Book, int Author. Таблица базы данных авторов (int Id, varchar Name) не используется в запросе. Я хочу добавить имя автора для каждого члена условия подпоследовательности BOOK_Authors: Author = Id. Например:

BOOK_Authors.Author = 1  ----- take Name form the Authors table by Id = 1
BOOK_Authors.Author = 2  ----- take Name form the Authors table by Id = 2
...

Возможно ли это сделать с одним запросом LINQ?

Ответы [ 2 ]

0 голосов
/ 12 декабря 2010

Решение с использованием Microsoft Entity Framework удивительно просто. Классы обертки базы данных, сгенерированные Entity Framework Wizard, содержат поля навигации, которые позволяют получить доступ ко всем связанным полям без написания запросов на соединение. Итак, в проекте Entity Framework запрос выглядит так:

var result = from book in dataContext.Books orderby book.Title select book;

Все связанные поля, такие как название категории, коллекция авторов и имя каждого автора, доступны с помощью полей навигации.

0 голосов
/ 05 декабря 2010

Я вижу проблему, это почти как если бы вы хотели еще одно объединение, но без множественности добавления еще одного объединения. Вы можете достичь этого, например, с помощью выбора элемента в новом экземпляре книги (имейте в виду, что на самом деле это может не сработать, поскольку я раньше не пробовал этого с объединением book_authors ...):

BOOK_Authors = dataContext.Authors.Where(a => book_authors.Contains(a.Author))

Однако из-за предопределенной схемы, которую LINQ настроил для вас, было бы намного проще использовать эту иерархию и написать:

var results = dataContext.Books;

foreach(var book in results) {
    foreach(var authorLink in book.BookAuthors) {
        // the author is here in:
        // authorLink.Authors.Name
    }
}
// This is the same list for the first book only
var allBookAuthors = results.First().BookAuthors.Select(a => a.Author);

Надеюсь, это поможет, Том

EDIT

После игры с демонстрационным проектом я изменил BookAuthors на открытый класс, а затем добавил ссылку на BookAuthors Table в BookCatalog следующим образом:

public Table<BookAuthor> BookAuthors;

Затем я удалил весь код категории, поскольку он не компилировался (возможно, мой пример кода новее? Также категория связана с помощью book.Category) и использовал BOOK_Authors = book_authors.Select(a => a.Author), и он вернул всех соответствующих авторов. Из-за природы таблицы соединений эту работу нелегко выполнить стандартным способом from. Вероятно, есть способ использовать группирование и некоторые хитрости внешнего соединения, но я не считаю необходимым применять это, когда у используемых сущностей соответствующие соединения объединяются автоматически через их схему.

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