using CK.SCP.Utils; using System; using System.Collections.Generic; using System.Linq.Expressions; using System.Reflection; namespace ChangkeTec.Utils { public static class LinqHelper { public static Expression> GetFilterExpression(List filterConditionList) { Expression> condition = null; try { if (filterConditionList != null && filterConditionList.Count > 0) { foreach (FilterModel filterCondition in filterConditionList) { Expression> tempCondition = CreateLambda(filterCondition); if (condition == null) { condition = tempCondition; } else { if ("AND".Equals(filterCondition.Logic)) { condition = condition.And(tempCondition); } else { condition = condition.Or(tempCondition); } } } } } catch (Exception ex) { LogHelper.Write($"获取筛选条件异常:{ex.Message}"); } return condition; } private static Expression> CreateLambda(FilterModel filterCondition) { var parameter = Expression.Parameter(typeof(T), "p");//创建参数i var constant = Expression.Constant(filterCondition.Value);//创建常数 MemberExpression member = Expression.PropertyOrField(parameter, filterCondition.Column); if ("==".Equals(filterCondition.Action)) { return Expression.Lambda>(Expression.Equal(member, constant), parameter); } else if ("!=".Equals(filterCondition.Action)) { return Expression.Lambda>(Expression.NotEqual(member, constant), parameter); } else if (">".Equals(filterCondition.Action)) { return Expression.Lambda>(Expression.GreaterThan(member, constant), parameter); } else if ("<".Equals(filterCondition.Action)) { return Expression.Lambda>(Expression.LessThan(member, constant), parameter); } else if (">=".Equals(filterCondition.Action)) { return Expression.Lambda>(Expression.GreaterThanOrEqual(member, constant), parameter); } else if ("<=".Equals(filterCondition.Action)) { return Expression.Lambda>(Expression.LessThanOrEqual(member, constant), parameter); } //else if ("in".Equals(filterCondition.Action) && "1".Equals(filterCondition.DataType)) //{ // return GetExpressionWithMethod("Contains", filterCondition); //} //else if ("out".Equals(filterCondition.Action) && "1".Equals(filterCondition.DataType)) //{ // return GetExpressionWithoutMethod("Contains", filterCondition); //} else { return null; } } private static Expression> GetExpressionWithMethod(string methodName, FilterModel filterCondition) { ParameterExpression parameterExpression = Expression.Parameter(typeof(T), "p"); MethodCallExpression methodExpression = GetMethodExpression(methodName, filterCondition.Column, filterCondition.Value, parameterExpression); return Expression.Lambda>(methodExpression, parameterExpression); } private static Expression> GetExpressionWithoutMethod(string methodName, FilterModel filterCondition) { ParameterExpression parameterExpression = Expression.Parameter(typeof(T), "p"); MethodCallExpression methodExpression = GetMethodExpression(methodName, filterCondition.Column, filterCondition.Value, parameterExpression); var notMethodExpression = Expression.Not(methodExpression); return Expression.Lambda>(notMethodExpression, parameterExpression); } /// /// 生成类似于p=>p.values.Contains("xxx");的lambda表达式 /// parameterExpression标识p,propertyName表示values,propertyValue表示"xxx",methodName表示Contains /// 仅处理p的属性类型为string这种情况 /// /// /// /// /// /// private static MethodCallExpression GetMethodExpression(string methodName, string propertyName, string propertyValue, ParameterExpression parameterExpression) { var propertyExpression = Expression.Property(parameterExpression, propertyName); MethodInfo method = typeof(string).GetMethod(methodName, new[] { typeof(string) }); var someValue = Expression.Constant(propertyValue, typeof(string)); return Expression.Call(propertyExpression, method, someValue); } } }