.net核心多对多关系

时间:2018-04-07 21:44:13

标签: optimization asp.net-core orm entity-framework-core

我正在努力确定实现这一目标的最聪明方法。我可能会过度思考我想要做的事情,但是这里有。

我有以下实体,简化

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并加载所有相关的竞争对手以显示在列表中,我工作得很好。

但是我需要另一个名单(在同一页面上)的Gymmanager的相关竞争对手,但也有一个特定的meetid在“MeetComp”表中有一个条目。因此,列表#1是我的所有竞争对手,列表#2是我为该会议注册的所有竞争者。

使用ThenInclude(),EF第一次获取数据会更聪明吗?然后我写一些逻辑来确定它们是否被添加到列表#2中?或者我应该再次访问数据库?然后,如果我再次访问数据库,那么有一种简单的方法来查询我已经拥有的CompId列表吗?

1 个答案:

答案 0 :(得分: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);
    }