Как получить 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 шт):
Нашел решение
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;
}
Прочитал комментарий, что Вы нашли решение.
Можно написать метод 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 сегодня делает восхитительные оптимизации запросов, но я не уверен что в данном случае он сможет его оптимизировать.