如何使用LINQ筛选Color属性与指定颜色集合存在匹配的Product集合
问题原因
你原先的代码逻辑是判断Product的整个Color拼接字符串是否完全等于筛选集合中的某一项,自然无法匹配到包含多个颜色的Color属性值。
正确实现方案
仅用LINQ就可以实现需求,核心是拆分Color属性后判断是否和筛选集合有交集:
Products = Products.Where(p => // 拆分Color属性并自动去除每个颜色前后的空格 p.Color.Split(',', StringSplitOptions.TrimEntries) // 判断拆分后的颜色是否有任意一个存在于筛选集合中 .Any(splitColor => colorsForFiltering.Contains(splitColor)) );
兼容场景补充
- 低版本.NET不支持
StringSplitOptions.TrimEntries的话,替换为拆分后手动去空格即可:
Products = Products.Where(p => p.Color.Split(',') .Select(c => c.Trim()) .Any(splitColor => colorsForFiltering.Contains(splitColor)) );
- 需要忽略大小写匹配的话,修改匹配逻辑:
Products = Products.Where(p => p.Color.Split(',', StringSplitOptions.TrimEntries) .Any(splitColor => colorsForFiltering.Contains(splitColor, StringComparer.OrdinalIgnoreCase)) );
- 如果是EF Core等ORM场景下查询数据库,拆分字符串的操作可能无法被翻译为SQL,内存中筛选完全可以用以上方案,数据库查询建议提前确认对应ORM的函数支持情况。
内容的提问来源于stack exchange,提问作者Alazarn
相关产品推荐
相关产品推荐

