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

如何基于Dictionary元素动态生成多条件Lambda查询表达式?

解决方案

核心通过C#表达式树动态构建OR连接的查询条件,可适配任意元素数量的Dictionary输入,兼容所有标准LINQ提供器(EF Core/EF6等)。

前置依赖

需引入命名空间:
System.Linq.Expressions

完整实现代码

我们可以封装为通用的IQueryable扩展方法,复用性更强:

using System.Linq.Expressions;

public static class QueryableExtensions
{
    public static IQueryable<T> WhereBooleanOr<T>(this IQueryable<T> source, Dictionary<string, bool> conditionItems)
    {
        // 空字典直接返回原查询,可根据业务需求调整为空返回空集合
        if (conditionItems == null || !conditionItems.Any())
            return source;

        // 构建Lambda参数 e => ...
        var parameter = Expression.Parameter(typeof(T), "e");
        Expression combinedCondition = null;

        foreach (var item in conditionItems)
        {
            // 获取实体属性表达式 e.PropertyName
            var propertyExpr = Expression.Property(parameter, item.Key);
            // 构建相等判断条件 e.PropertyName == 对应bool值
            var equalExpr = Expression.Equal(propertyExpr, Expression.Constant(item.Value, typeof(bool)));

            // 拼接OR逻辑
            combinedCondition = combinedCondition == null 
                ? equalExpr 
                : Expression.OrElse(combinedCondition, equalExpr);
        }

        // 生成完整的条件Lambda并传入Where方法
        var conditionLambda = Expression.Lambda<Func<T, bool>>(combinedCondition, parameter);
        return source.Where(conditionLambda);
    }
}

使用示例

// 你的示例Dictionary
Dictionary<string, bool> items = new Dictionary<string, bool>();
items.Add("CostFree", true);
items.Add("Visible", true);
items.Add("Closed", true);

// 直接在查询链上调用扩展方法即可
var queryResult = dbContext.你的实体集合
    .WhereBooleanOr(items)
    .ToList();

注意事项

  • 字典传入的键名必须和实体类的布尔属性名完全匹配(大小写敏感),否则会触发运行时异常
  • 若需要切换为AND逻辑拼接条件,仅需将代码中的Expression.OrElse替换为Expression.AndAlso即可
  • 该实现生成的SQL与手写LINQ查询完全一致,无额外性能损耗

内容的提问来源于stack exchange,提问作者Gabor85

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 11:45:07