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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 08:15:06