C#中LINQ查询WHERE子句后如何嵌入动态OR匹配条件
方案1:适用于Linq to Objects/绝大多数EF/EF Core场景
直接用Any方法即可实现需求,不需要手动遍历拼接条件,框架会自动处理为OR逻辑:
首先定义关键词数组:
// 先把需要匹配的关键词存入数组 var matchKeywords = new[] { "asd", "dsa", "123", "456" };
改写你的LINQ查询即可:
var getOnlyMP = from mpPoint in cmList where matchKeywords.Any(key => mpPoint.Component.Contains(key)) select new MP { MPName = mpPoint.Component, X = mpPoint.PlaceX, Y = mpPoint.PlaceY, };
上述写法逻辑和你原代码的多ORContains完全一致:只要mpPoint.Component包含数组中任意一个关键词,就满足WHERE条件。如果是EF/EF Core查询数据库的场景,该写法会被自动翻译为类似Component LIKE '%asd%' OR Component LIKE '%dsa%' ...的SQL语句,不需要额外处理。
方案2:极端场景下动态构建表达式树(可选)
如果你使用的ORM不支持Any+Contains的自动翻译,可以手动构建表达式树生成动态OR条件,示例代码如下:
var matchKeywords = new[] { "asd", "dsa", "123", "456" }; // 构建参数表达式:mpPoint var parameter = Expression.Parameter(typeof(你的cmList元素类型), "mpPoint"); // 拿到Component属性的表达式 var componentProp = Expression.Property(parameter, nameof(mpPoint.Component)); // 获取string.Contains方法的元数据 var containsMethod = typeof(string).GetMethod(nameof(string.Contains), new[] { typeof(string) })!; // 拼接所有OR条件 Expression? condition = null; foreach (var key in matchKeywords) { var keyConstant = Expression.Constant(key); var containExpr = Expression.Call(componentProp, containsMethod, keyConstant); condition = condition == null ? containExpr : Expression.OrElse(condition, containExpr); } // 生成最终查询 var getOnlyMP = cmList .Where(Expression.Lambda<Func<你的cmList元素类型, bool>>(condition!, parameter)) .Select(mpPoint => new MP { MPName = mpPoint.Component, X = mpPoint.PlaceX, Y = mpPoint.PlaceY, });
使用时把代码中的你的cmList元素类型替换为cmList实际存储的元素类型即可。
内容的提问来源于stack exchange,提问作者László Bozsár
相关产品推荐
相关产品推荐

