相信在使用EF的时候对查询条件或者排序上的处理令人心烦,下面我们就来动态拼接表达式解决这一问题
当我们在查询中使用Where的时候可以看到如下参数
下面我们就来扩展 Expression<Func<T,bool>> 这个参数
第一步: 建立处理功能类
首先我们要创建一个查询条件转化为表达式的泛型功能类 如 UosoExpressionParser<T> 至于为什么要用泛型类目的很明确就是为了适配不同的模型参数
转化条件为表达式 那么处理一个方法来接受条件 返回表达式,条件可以按照自己的模式去设置
public Expression<Func<T, bool>> ParserConditions(IEnumerable<UosoConditions> conditions) { //将条件转化成表达是的Body var query = ParseExpressionBody(conditions); return Expression.Lambda<Func<T, bool>>(query, parameter); }
public class UosoConditions { /// <summary> /// 字段名称 /// </summary> public string Key { get; set; } /// <summary> /// 值 /// </summary> public string Value { get; set; } /// <summary> /// 值类型 /// </summary> public string ValueType { get; set; } /// <summary> /// /// </summary> public UosoOperatorEnum Operator { get; set; } }
第二步: 条件转表达式具体处理
具体去实现 ParseExpressionBody 条件 枚举提供操作方式 如:(like 、 = 、!= 、> 、< 、>= 、<= 、in 、 between)
private Expression ParseExpressionBody(IEnumerable<UosoConditions> conditions) { if (conditions == null || conditions.Count() == 0) { return Expression.Constant(true, typeof(bool)); }