You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 13:36:02