EF Core+LINQ多字符串数组过滤列表失效问题求助
问题分析
你遇到的问题核心是大小写不匹配:你将过滤数组participantArray的所有元素转成了小写,但数据库中p.Person.Name的原始值未做大小写转换,导致多字符串过滤时,部分元素无法匹配到数据库中的对应值,最终没有符合条件的记录返回。
另外还要排查participantArray是否包含空白元素——比如用|分割时,可能产生空字符串或仅含空格的元素,这也会干扰过滤逻辑。
解决方案
1. 统一大小写匹配
将数据库中的Person.Name也转成小写后再判断包含关系,确保大小写一致:
var participantArray = query.Participant.Split('|') .Select(x => x.Trim().ToLower()) .Where(x => !string.IsNullOrEmpty(x)) .ToArray(); entities = entities.Where(x => x.Financeiro.Contrato.Participants.Any(p => participantArray.Contains(p.Person.Name.ToLower())));
2. (可选)使用EF Core不区分大小写查询
如果你的项目基于EF Core,也可以利用框架自带的不区分大小写比较方法,避免手动转小写:
var participantList = query.Participant.Split('|') .Select(x => x.Trim()) .Where(x => !string.IsNullOrEmpty(x)) .ToList(); entities = entities.Where(x => x.Financeiro.Contrato.Participants.Any(p => participantList.Any(pl => EF.Functions.Like(p.Person.Name, $"%{pl}%", StringComparison.OrdinalIgnoreCase))));
注意:
EF.Functions.Like的第三个参数在不同EF Core版本中可能有差异,需根据实际版本调整。
3. 排查分割后的数组有效性
确保分割后的数组没有无效元素,比如空字符串、全空格字符串,这一步已经包含在上面的代码中,通过Trim()和Where(x => !string.IsNullOrEmpty(x))过滤掉无效项。
内容的提问来源于stack exchange,提问作者meirochou
相关产品推荐
相关产品推荐

