如何使用具有多对多关系的 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)
类似的效果
我在实体用户和组之间有多对多关系,我也有加入 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)
类似的效果