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

传入Null参数时,C#调用存储过程返回全表数据的问题求助

传入Null参数时,C#调用存储过程返回全表数据的问题求助

大家好,我遇到一个棘手的问题想请教各位大佬。我写了一个GetUserPermissions方法,本意是通过传入的UserId参数调用存储过程,从数据库获取指定用户的权限行数据,但现在发现当参数为null时,这个方法会返回全表的所有权限数据,这和预期完全不符。

我的存储过程逻辑大致是:当传入的@UserId参数不为空时,筛选出对应用户的权限记录;但如果参数未传入(也就是null的情况),就会返回所有用户的权限数据。

以下是我的C#代码实现:

public static List<UserPermission> GetUserPermissions(UserPermissionArgs userPermissionArgs)
{
     var permissions = helper.GetModelFromDB<UserPermission>("GetUserPermissions", GetNonNullAttributes(userPermissionArgs).ToArray()).ToList();

     permissions = permissions.GroupBy(d => d.PermissionId).Select(x => x.First()).ToList();

     // Add available permissions that user does not have to list of permissions
     var allPermissions = GetPermission(new PermissionArgs() { });

     foreach (var permission in allPermissions)
     {
         if (permissions.All(p => p.PermissionId != permission.Id))
         {
             permissions.Add(new UserPermission() { PermissionId = permission.Id, State = false });
         }
     }

     Parallel.ForEach(permissions, permission => permission.Permission = GetPermission(new PermissionArgs()
     { PermissionId = permission.PermissionId }).Single());

     return permissions.ToList();
}

private static IEnumerable<SqlParameter> GetNonNullAttributes(object args, bool checkStringsEmpty = true)
{
    PropertyInfo[] properties = args.GetType().GetProperties();
    List<SqlParameter> parameters = new List<SqlParameter>();

    foreach (PropertyInfo property in properties)
    {
        object[] attributes = property.GetCustomAttributes(true);

        foreach (var attribute in attributes.Where(attribute => attribute.GetType() == typeof(SpParameter)).Where(attribute => property.GetValue(args) != null))
        {
            if (checkStringsEmpty && property.GetType() == typeof(string))
            {
                if (string.IsNullOrEmpty((string)property.GetValue(args)))
                {
                    //If string is empty, don't add it as a parameter
                    continue;
                }
            }

            SpParameter param = (SpParameter)attribute;
            parameters.Add(new SqlParameter(param.Name, property.GetValue(args)));
        }
    }

    return parameters;
}

我初步猜测问题可能出在GetNonNullAttributes方法里——当UserId为null时,这个方法没有把@UserId参数传递给存储过程,导致存储过程因为没收到这个参数,触发了返回全表的逻辑。但我不确定该怎么修改才能实现:当传入null时,要么返回空列表,要么做其他符合预期的处理,而不是返回所有数据。

希望各位能帮我分析一下问题所在,或者给出具体的修改建议,谢谢大家!

备注:内容来源于stack exchange,提问作者Dinesh wakti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 10:29:38