C#多LINQ条件链式查询用户异常:部分字段匹配结果不符
问题分析与修复方案
你的查询返回异常结果的核心问题是针对AthleteTeams的条件判断用错了方法,同时存在大小写处理不一致的问题:
错误使用
All方法:All要求集合中的每一条记录都满足条件才会返回true,但你实际需要的是:用户的关联团队中只要有任意一条符合筛选条件就应该被选中,这时候应该用Any方法。大小写处理不一致:
前面的Name、Surname等字段都做了ToLower()处理来实现大小写不敏感查询,但Team.Name、AthleteGender、AthleteRace的判断没有统一处理,会导致大小写不匹配的情况被遗漏。
修正后的代码
data = data.Where(x => x.Name.ToLower().Contains(filter.ToLower()) || x.Surname.ToLower().Contains(filter.ToLower()) || (x.PhoneNumber != null && x.PhoneNumber.ToLower().Contains(filter.ToLower())) || x.Email.ToLower().Contains(filter.ToLower()) || x.AthleteTeams.Any(at => at.Team.Name.ToLower().Contains(filter.ToLower())) || x.AthleteTeams.Any(at => at.Athlete.AthleteGender.Equals(filter, StringComparison.OrdinalIgnoreCase)) || x.AthleteTeams.Any(at => at.Athlete.AthleteRace.Equals(filter, StringComparison.OrdinalIgnoreCase)) );
额外优化点
- 给
PhoneNumber加了空值判断,避免NullReferenceException(如果电话号码可能为null的话) - 把
filter也统一转成小写,避免因为输入的筛选值大小写导致匹配失败 - 用
StringComparison.OrdinalIgnoreCase代替ToLower()+Equals,性能更优且更严谨
内容的提问来源于stack exchange,提问作者Myles Louw
相关产品推荐
相关产品推荐

