Как получить Id с связующей таблицы?

Есть таблицы Author, PrintingEdition и связующая таблица AuthorInPrintingEdition связь many-to-many. Подскажите как мне вытащить список AuthorId из таблицы AuthorInPrintingEdition по printingEdition. Таблица AuthorInPrintingEdition

public class AuthorInPrintingEdition : BaseEntity
    {

        public long AuthorId { get; set; }
        public long PrintingEditionId { get; set; }
        public virtual Author Author { get; set; }
        public virtual PrintingEdition PrintingEdition { get; set; }
    }
}

Получаю всех Author из AuthorInPrintingEdition по printingEdition, но дальше не знаю как получить список AuthorId

    public async Task<List<long>> GetPrintingEdition(long printingEditionId)
        {
            var printingEdition = _dbSet
                                        .Include(authorInPrintingEdition => authorInPrintingEdition.AuthorInPrintingEdition)
                                        .ThenInclude(author => author.Author)
                                        .FirstOrDefaultAsync(printignEdition => printignEdition.Id == printingEditionId);


        }

Ответы (2 шт):

Автор решения: Dmitriy

Нашел решение

public async Task<List<long>> GetAuthorsIdByPrintingEditionAsync(long printingEditionId)
{
       var author = await _dbSet.Authors
                          .Where(printing => printing.AuthorInPrintingEdition.Any(printing => printing.PrintingEdition.Id == printingEditionId))
                          .ToListAsync();

       List<long> authorsId = new List<long>();

       foreach(var id in author)
       {
           authorsId.Add(id.Id);
       }

       return authorsId;
}
→ Ссылка
Автор решения: Parawaram

Прочитал комментарий, что Вы нашли решение.

Можно написать метод GetAuthorsIdByPrintingEditionAsync по другому, тогда и выглядеть будет проще и к БД будет меньше запросов.

Вот мой вариант этого метода:

    public async Task<List<long>> GetAuthorsOfPrintingEditionAsync(long printingEditionId)
    {
        return _dbSet.AuthorInPrintingEditions
            .Where(printing => printing.PrintingEditionId == printingEditionId)
            .Select(printing => printing.AuthorId)
            .ToListAsync();
    }

Такая запись по мне выглядит короче и понятнее. Со стороны EF я думаю что этот запрос будет работать тамного быстрее, так как работает только с одной связующей таблицей без join и т.д. Так же он не будет запрашивать полную информацию об авторе (нужна только Id и она есть в AuthorInPrintingEdition) В Вашем случае будут найдены все авторы, все принтинги к ним, проверены все принтинги и только потом возващены все авторы. Если в будущем нужна будет вся информация об авторе по конкретному принтингу запрос очень просто изменить как-нибудь вот так:

    public async Task<List<Author>> GetAuthorsOfPrintingEditionAsync(long printingEditionId)
    {
        return _dbSet.AuthorInPrintingEditions
            .Where(printing => printing.PrintingEditionId == printingEditionId)
            //.Include(printing => printing.Author) Если автор не подгружен раскоментировать
            .Select(printing => printing.Author)
            .ToListAsync();
    }

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

→ Ссылка