Entity Framework Core 如何查询用户作为所有者或团队成员可访问的Playlist
解决方案
实现思路
- 在原有查询条件的基础上增加「播放列表关联团队的成员包含当前用户」的或条件
- 增加
Distinct操作避免同一个播放列表同时满足两个条件时重复返回
代码实现
写法1:直接通过导航属性查询(无需额外字段)
var playlists = await _context.Playlists .Where(pl => // 条件1:当前用户是播放列表所有者 pl.OwnerId == userId // 条件2:播放列表有关联团队,且当前用户是该团队成员 || (pl.Team != null && pl.Team.Members.Any(m => m.AppUserId == userId)) ) // 去重,避免同时满足两个条件的播放列表重复返回 .Distinct() .ToListAsync();
写法2:预查团队ID优化性能(推荐)
首先建议给Playlist实体补充TeamId外键,可大幅提升查询效率:
public class Playlist : AuditEntity { public string PlaylistName { get; set; } public Guid OwnerId { get; set; } public virtual AppUser Owner { get; set; } // 新增关联团队ID外键,可为空表示是私人播放列表 public Guid? TeamId { get; set; } public Team Team { get; set; } }
查询代码:
// 先获取当前用户加入的所有团队ID var userTeamIds = await _context.Set<TeamsAppUsers>() .Where(tu => tu.AppUserId == userId) .Select(tu => tu.TeamId) .ToListAsync(); var playlists = await _context.Playlists .Where(pl => pl.OwnerId == userId || (pl.TeamId.HasValue && userTeamIds.Contains(pl.TeamId.Value)) ) .Distinct() .ToListAsync();
内容的提问来源于stack exchange,提问作者CMorgan
相关产品推荐
相关产品推荐

