Сложный запрос LINQ - отношения нескольких таблиц - PullRequest
1 голос
/ 26 июня 2019

У меня есть база данных книг, в которой есть ICollection авторов. Я хочу вернуть объект author на основе AuthorId с помощью LINQ.

Book db

int BookId
string Name { get; set; }
public ICollection<Author> Authors { get; set; }

Author db
int AuthorId
string Name
ICollection<Quote> Quotes { get; set; }
ICollection<Penname> Pennames { get; set; } - Edit: Added for clarity

Я пробовал:

var test = _context.Book.Include(x => x.Authors).Include("Authors.Quotes")
                    .Select(y => y.Authors)

Что дало мне:

EntityQueryable<ICollection<Authors>>
[0] {HashSet<Author>} [0]{Author} [1]{Author} [3]{Author} 
[1] {HashSet<Author>} [0]{Author} [1]{Author} 
[2] {HashSet<Author>} [0]{Author} [1]{Author} 

Я просто не могу понять, как выполнять итерацию, хотя авторы в списке авторов. Примерно так:

var id = 2

var test = _context.Book.Include(x => x.Authors).Include("Authors.Quotes")
                    .Select(y => y.Authors.Select(x => x.Author).Where(x => x.AuthorId == id))

Если я когда-нибудь сделаю серьезное обновление, я мог бы использовать эластичный ...

Обновление @Marko Papic:

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

var test = _context.Book.Include(x => x.Authors)
                   .ThenInclude(x => x.Quotes)
                   .Include(x => x.Authors)
                   .ThenInclude(x => x.Pennames)

Однако, если я использую SelectMany, тогда кавычки и псевдонимы заканчиваются как нуль

var test = _context.Book.Include(x => x.Authors)
                   .ThenInclude(x => x.Quotes)
                   .Include(x => x.Authors)
                   .ThenInclude(x => x.Pennames)
                   .SelectMany(x => x.Authors).Where(x => x.AuthorId == id);

Author myauthor
int AuthorId = 2
string Name = "Bob"
ICollection<Quote> Quotes = null
ICollection<Penname> Pennames = null

Ответы [ 2 ]

0 голосов
/ 26 июня 2019

Я думаю, что включения игнорируются, потому что тип результата запроса не совпадает с типом вашего dbset при запуске, из документации :

Если вы измените запрос, чтобы он больше не возвращал экземпляры тип сущности, с которого начался запрос, затем операторы включения игнорироваться.

Я предполагаю, что соотношение между Books и Authors много-много, если это так, то я бы выполнил ваш запрос:

var query=_context.Authors.Include(a=>a.Books)
                          .Include(a=>a.Quotes)
                          .Include(a=>a.Pennames)
                          .Where(a=> a.AuthorId == id);
0 голосов
/ 26 июня 2019

Вы можете использовать SelectMany :

var test = _context.Book.Include(x => x.Authors).ThenInclude(x => x.Quotes)
                    .SelectMany(x => x.Authors).Where(x => x.AuthorId == id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...