如何基于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
相关产品推荐
相关产品推荐

