ASP.NET Core API如何基于登录用户ID筛选MerchantId匹配的Mandate记录
你现在的写法有两个核心问题:
- 你手动
new出来的ClaimsPrincipal是空实例,根本无法获取到当前请求的登录用户ID,必须从请求关联的HttpContext中取用户身份信息。 - 你现在写的是单个
Mandate实体转DTO的方法,筛选逻辑不该放在这里,要提前到查询Mandate数据集的环节,既符合逻辑也能减少不必要的数据库查询开销。
具体操作步骤
- 第一步:注册
IHttpContextAccessor服务,在你的Program.cs中添加以下代码:
builder.Services.AddHttpContextAccessor();
如果你的查询逻辑直接写在Controller中,可以跳过这步,Controller自带的User属性就能直接拿到当前登录用户的身份信息。
- 第二步:拿到当前登录用户ID后,在查询时加
Where条件筛选即可,参考完整代码示例:
// 示例为业务服务类的实现,你也可以直接写在控制器中 public class MandateService { private readonly YourDbContext _dbContext; private readonly IHttpContextAccessor _httpContextAccessor; // 构造函数注入依赖 public MandateService(YourDbContext dbContext, IHttpContextAccessor httpContextAccessor) { _dbContext = dbContext; _httpContextAccessor = httpContextAccessor; } // 获取当前登录用户关联的Mandate列表 public List<MandateGetDto> GetCurrentUserMandates() { // 从当前请求的HttpContext中取登录用户ID var loggedInUserId = _httpContextAccessor.HttpContext?.User.FindFirstValue(ClaimTypes.NameIdentifier); // 未登录场景自行处理,示例直接返回空列表 if (string.IsNullOrWhiteSpace(loggedInUserId)) return []; // 查询时直接筛选符合条件的记录,再转DTO return _dbContext.Mandates .Where(m => m.MerchantId == loggedInUserId) .Select(FromMandateToMandateGetDto) .ToList(); } // 你的DTO转换方法可以保留,删掉里面没用的ClaimsPrincipal相关代码即可 private MandateGetDto FromMandateToMandateGetDto(Mandate mandate) { return new MandateGetDto { MerchantId = mandate.MerchantId, DueDate = mandate.DueDate, StartDate = mandate.StartDate, EndDate = mandate.EndDate }; } }
内容的提问来源于stack exchange,提问作者Olugbenga
相关产品推荐
相关产品推荐

