C# LINQ如何将运算符设为变量实现单查询适配多筛选条件
实现方案
你可以通过以下三种方案实现单份LINQ查询的动态筛选逻辑,避免重复编写高度相似的代码:
方案1:利用IQueryable延迟执行特性分步拼接(优先推荐)
IQueryable查询本身支持在执行前动态追加条件,完全原生无第三方依赖,也能被EF等ORM正常翻译成SQL,适配你提到的3个参数8种组合的场景:
// 先定义比较类型枚举,也可以直接用字符串传运算符 public enum DateCompareType { Equal, GreaterThan, LessThan } // 查询方法逻辑示例 public List<FooBar> QueryData(DateCompareType dateCompareType, DateTime variableDate, /* 你的另外两个参数 */) { // 1. 先写所有逻辑共用的基础查询,原来9行的共用逻辑都放在这里 IQueryable<FooBar> query = from x in db.FooBar /* 你原来的共用排序、关联、投影等9行里的非筛选逻辑 */ select x; // 2. 动态追加第一个参数(日期)的筛选条件 switch (dateCompareType) { case DateCompareType.Equal: query = query.Where(x => x.Date == variableDate); break; case DateCompareType.GreaterThan: query = query.Where(x => x.Date > variableDate); break; case DateCompareType.LessThan: query = query.Where(x => x.Date < variableDate); break; } // 3. 同理处理第二个、第三个参数的筛选逻辑,每个参数独立判断是否追加条件 if (/* 第二个参数触发筛选的条件 */) { query = query.Where(/* 第二个参数对应的筛选逻辑 */); } if (/* 第三个参数触发筛选的条件 */) { query = query.Where(/* 第三个参数对应的筛选逻辑 */); } // 4. 最后才执行查询获取结果 return query.ToList(); }
该方案所有逻辑透明,无额外学习成本,维护难度最低。
方案2:使用动态LINQ简化写法
如果筛选逻辑非常灵活,不想写大量分支判断,可以安装NuGet包System.Linq.Dynamic.Core,直接用字符串拼接筛选条件:
// variableDateFormula可以是 ">="、"=="、"<" 这类运算符字符串 string whereCondition = $"Date {variableDateFormula} @0"; var results = db.FooBar .Where(whereCondition, variableDate) /* 其他共用逻辑 */ .ToList();
该方案写法更简洁,适合条件规则经常变更的场景。
方案3:自定义表达式树构建逻辑
如果不想引入第三方库又需要极高的灵活度,可以手动构建表达式树实现动态运算符拼接:
var parameter = Expression.Parameter(typeof(FooBar), "x"); var property = Expression.Property(parameter, "Date"); var constant = Expression.Constant(variableDate, typeof(DateTime)); // 根据运算符动态生成对应比较表达式 BinaryExpression compareExp = variableDateFormula switch { "==" => Expression.Equal(property, constant), ">" => Expression.GreaterThan(property, constant), "<" => Expression.LessThan(property, constant), _ => throw new ArgumentOutOfRangeException() }; var lambda = Expression.Lambda<Func<FooBar, bool>>(compareExp, parameter); var results = db.FooBar.Where(lambda).ToList();
内容的提问来源于stack exchange,提问作者Rick
相关产品推荐
相关产品推荐

