传入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
相关产品推荐
相关产品推荐

