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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 18:18:26