如何使用具有多对多关系的 table 的 LINQ 来 select 加入 table 所需的记录?

How to select needed records in joining table using LINQ with tables which have many to many relationship?

我在实体用户和组之间有多对多关系,我也有加入 table GroupParticipants。

public class User
{
    public string Id {get; set;}

    public ICollection<GroupParticipant> Group { get; set;}
}

public class Group
{
    public int Id { get; set; }
    public ICollection<GroupParticipant> Participants { get; set; }
    
}

public class GroupParticipant
{
    public int GroupId { get; set; }
    public string ParticipantId { get; set; }

    public User Participant { get; set; }
    public Group Group { get; set; }
}

我需要 select 用户指定用户未加入的群组。我想做类似的事情:

string userId = 5;
var groupsAvailableToJoin = await _context.Groups
    .Where(group => group.Participants.Id != userId);

谢谢!

这样的查询:

_context.Groups.Where(g =>
    !_context.GroupParticipants.Any(gp => gp.UserId == userId && gp.GroupId == g.I'd
); 

应翻译为:

  SELECT * FROM Groups g
  WHERE NOT EXISTS(SELECT null FROM groupParticipants gp WHERE gp.UserId = 5 AND gp.GroupId = g.Id)

这应该是让您获得所需内容的一种合理高效的方式。我确信 GroupParticipants 列已编入索引。


有多种写法 - 如果您发现两步法更容易理解,它实际上与以下方法相同:

var joined = _context.GroupParticipants.Where(gp => gp.UserId == 5).Select(gp => gp.GroupId).ToList();
var notJoined = _context.Groups.Where(g => !joined.Contains(g.Id));

这个翻译成 NOT IN (list,of,groups,they,are,in) 类似的效果