Linq使用Contains匹配逗号分隔字符串无结果问题排查与解决
逗号分隔RoleIds的Linq过滤失效问题及修复
需求是基于RoleIds过滤查询结果:UI多选控件生成逗号分隔的角色ID字符串,存储过程也会生成格式相同的逗号分隔字符串映射到EF模型的RolesIds字段。但原Linq过滤代码无法得到预期结果——明明存在对应角色的用户,进入过滤逻辑后结果却被全部清空。
相关代码片段
存储过程代码
RolesIds = STUFF((select ', ' + CONVERT(VARCHAR(10),i.ItemDictionaryId) FROM dbo.ItemDictionary i JOIN GroupMemberRoleXref gmrx ON gmrx.RoleId = i.ItemDictionaryId join GroupMemberLog gml on gml.GroupMemberLogId = gmrx.GroupMemberLogId where gml.CustomerId = c.CustomerId and gml.GroupId = @GroupId and (gmrx.EndDate >= md.StartDAte OR gmrx.EndDate IS NULL) and gmrx.StartDate <= md.StartDAte FOR XML PATH('')), 1, 1, ''),
EF模型定义
public string RolesIds { get; set; }
原失效过滤代码
List<string> rolesList = roleIds.Split(',').ToList(); if (!string.IsNullOrWhiteSpace(roleIds)) { usersResult= usersResult.Where(x => rolesList.Contains(x.RolesIds)).ToList(); }
问题原因
原代码逻辑错误:rolesList.Contains(x.RolesIds)是判断用户的完整RolesIds字符串是否存在于单个角色ID组成的rolesList中。比如用户的RolesIds是"33, 25",而rolesList里是["33"],显然无法匹配,导致所有结果被过滤。
正确逻辑应该是:检查用户的RolesIds字符串中是否包含任意一个选中的角色ID。
修复后的有效代码
List<string> rolesList = roleIds.Split(',').ToList(); // 额外过滤逻辑 if (rolesList.Count > 0) { usersResult= usersResult.Where(x => rolesList.Any(y => x.RolesIds.Contains(y))).ToList(); }
内容的提问来源于stack exchange,提问作者Jefferson
相关产品推荐
相关产品推荐

