Присоединяйтесь к запросу get api один ко многим

#c# #linq #.net-core

Вопрос:

Я пытаюсь объединить музыкантов и их инструменты в одном вызове api. До сих пор я пробовал использовать некоторые операторы linq, но пока это не работает. Можно ли это сделать с помощью linq? Это то, что у меня есть до сих пор:

 // GET: api/Muziekants
[HttpGet]
public async Task<ActionResult<IEnumerable<Muziekant>>> GetMuziekants()
{
    return await _context.Muziekants
        .Include(m => m.Instruments)
            .ThenInclude(i => i.MuziekantId)
        .Include(m => m.Instruments)
        .ToListAsync();

    //return await _context.Muziekants.ToListAsync();

}
 

Вот как выглядит модель muziekant:

 public class Muziekant
{
    public int Id { get; set; }

    [Required]
    [MinLength(3, ErrorMessage = "Minimaal 3 karakters")]
    [MaxLength(40, ErrorMessage = "Maximaal 40 karakters")]
    public string Voornaam { get; set; }

    [Required]
    [MinLength(3, ErrorMessage = "Minimaal 3 karakters")]
    [MaxLength(50, ErrorMessage = "Maximaal 50 karakters")]
    public string Achternaam { get; set; }

    [Required]
    [Range(1900, 2022, ErrorMessage = "Jaar moet tussen  1900 en 2022 zijn")]
    public int StartJaar { get; set; }

    [Range(1900, 2022, ErrorMessage = "Jaar moet tussen  1900 en 2022 zijn")]
    public int? StopJaar { get; set; }

    public ICollection<Instrument> Instruments { get; set; }


}
 

И инструмент выглядит так:

 public class Instrument
{
    public int Id { get; set; }
    [Required]
    [MaxLength(40, ErrorMessage = "Maximaal 40 karakters")]
    public string Naam { get; set; }
    [MaxLength(30, ErrorMessage = "Maximaal 30 karakters")]
    public string Type { get; set; }
    [MaxLength(30, ErrorMessage = "Maximaal 30 karakters")]
    public string Bijnaam { get; set; }
    public int Waarde { get; set; }

    [ForeignKey("Muziekant")]
    public int? MuziekantId { get; set; }
}
 

Комментарии:

1. Какого типа отношений вы хотите? Один ко многим?

2. @Genusatplay да

Ответ №1:

Include введено не для объединения, а для загрузки связанных сущностей, и на самом деле оно реализовано как соединение с другими таблицами, потому что это собственный способ SQL, как их загружать.

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

 // GET: api/Muziekants
[HttpGet]
public async Task<ActionResult<IEnumerable<Muziekant>>> GetMuziekants()
{
    return await _context.Muziekants
       .Include(m => m.Instruments)
       .ToListAsync();
}