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

ASP.NET Web API查询已登录用户(Status=true)过滤失效问题

问题描述

实现查询所有已登录用户的接口时过滤逻辑未生效,业务规则要求:用户Status属性值为true时代表已登录,Status为false的用户需要从返回列表中过滤,不对外展示。实际运行后所有Status为false的用户也被一并返回,过滤逻辑完全失效。

问题相关现有代码

Model定义

[Table("Contact")]
public partial class Contact
{
    [Key]
    public Guid Id { get; set; }
    public string DisplayName { get; set; } = null!;
    public string ProfilePic { get; set; } = null!;
    public int? Rating { get; set; }
    public bool? Status { get; set; }
    public bool? IsRegistration { get; set; }
}

DbContext定义

public virtual DbSet<Contact> Contacts { get; set; } = null!;

Repository层实现

private readonly TalkBackContactsDbContext _context;

public ContactsRepository(TalkBackContactsDbContext context)
{
    _context = context;
}

public IQueryable<Contact> GetAllConnectedUser(Contact contact)
{

    if (contact.Status == false)
    {
        throw new Exception("Not exist");
    }
    else
    {
        return _context.Contacts;
    }
}

API Controller层实现

private readonly IContactsRepository _repo;
public ContactsController(IContactsRepository repo)
{
    _repo = repo;
}

[HttpGet()]
public IEnumerable<Contact> GetAllConnected()
{
    var contact = new Contact();

    try
    {
        return _repo.GetAllConnectedUser(contact);
    }
    catch (Exception e)
    {
        e.ToString();
    }
    return _repo.GetAllConnectedUser(contact);

}
问题根因
  • Repository逻辑完全偏离需求:当前判断的是传入方法的参数对象的Status值,根本没有对数据库中存储的用户集合做过滤,只要传入参数的Status不等于false,就直接返回全量用户数据
  • Controller传入的参数是手动new的空Contact实例,可空bool类型Status默认值为null,Repository中contact.Status == false判断结果为false,直接进入else分支返回全量表数据
  • Controller的异常捕获逻辑无效:catch块仅调用e.ToString(),既不记录日志也不返回错误响应,捕获完成后还会再次调用Repository方法重复执行错误逻辑
  • 全程没有编写针对用户表Status字段的筛选条件,自然无法过滤Status为false的未登录用户
修复后代码

调整Repository层方法

移除无意义的Contact入参,直接对用户数据集增加Where过滤条件:

private readonly TalkBackContactsDbContext _context;

public ContactsRepository(TalkBackContactsDbContext context)
{
    _context = context;
}

public IQueryable<Contact> GetAllConnectedUser()
{
    // 筛选Status为true的已登录用户,兼容可空bool类型判断
    return _context.Contacts.Where(c => c.Status == true);
}

调整Controller层接口

删除冗余的空对象初始化、无效异常捕获逻辑,调用Repository方法时建议使用ToList()立即执行查询,避免DbContext释放后出现迭代异常:

private readonly IContactsRepository _repo;
public ContactsController(IContactsRepository repo)
{
    _repo = repo;
}

[HttpGet()]
public IEnumerable<Contact> GetAllConnected()
{
    return _repo.GetAllConnectedUser().ToList();
}

内容的提问来源于stack exchange,提问作者Tommy Udi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 00:21:50