.net Core отношение «многие ко многим»

avatar
bjbowen4
7 апреля 2018 в 21:44
223
1
0

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

У меня есть следующие сущности, упрощенные

public class Meet
{
    public int Id { get; set; }
    //various properties
    public List<MeetComp> Competitors { get; set; }
}

public class Competitor
{
    public int Id { get; set; }
    // various properties
    public List<MeetComp> Meets { get; set; }

    [ForeignKey("GymManager")]
    public int GymManagerId { get; set; }
    public GymManager GymManager { get; set; }
}

public class GymManager
{
    public int Id { get; set; }
    //various properties
    public List<Competitor> Competitors { get; set; }
}

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

    [ForeignKey("Competitor")]
    public int CompetitorId { get; set; }
    public Competitor Competitor { get; set; }

    [ForeignKey("Meet")]
    public int MeetId { get; set; }
    public Meet Meet { get; set; }
}

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

Однако мне нужен еще один список (на той же странице) связанных конкурентов Gymmanager, а также тех, у кого есть запись в таблице «MeetComp» по определенному идентификатору встречи. Таким образом, список № 1 — это все мои участники, а список № 2 — все мои участники, зарегистрированные для участия в этом соревновании.

Было бы разумнее, чтобы EF извлекал данные, которые я получаю в первый раз с помощью ThenInclude()? Затем я пишу некоторую логику, чтобы определить, будут ли они добавлены в список № 2? или я должен сделать еще одну поездку в базу данных? Затем, если я совершу еще одну поездку в базу данных, есть ли простой способ запросить список CompId, который у меня уже есть?

Источник

Ответы (1)

avatar
bjbowen4
8 апреля 2018 в 19:10
0

Итак, вот что я в итоге сделал, так это совершил еще одну поездку в БД.

    public async Task<IActionResult> GetRegisteredComps(List<int> Comps, int meetid)
    {
        if(Comps.Count == 0)
        {
            return Ok();
        }
        if(meetid == 0)
        {
            return BadRequest();
        }

        var query = _context.MeetsComps.Include(c => c.Competitor)
            .AsQueryable();
        query = query.Where(c => c.MeetId == meetid);
        query = query.Where(c => Comps.Contains(c.CompetitorId));

        var results = await query.ToListAsync();
        return Ok(results);
    }
Neville Nazerane
9 апреля 2018 в 05:40
0

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

Neville Nazerane
9 апреля 2018 в 05:41
0

_context.MeetsComps.Include(c => c.Competitor).Where(c => c.MeetId == meetid && Comps.Contains(c.CompetitorId))