using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Linq.Expressions; namespace MyCode.Project.Infrastructure { /// /// Represents the extender for Expression[Func[T, bool]] type. /// This is part of the solution which solves /// the expression parameter problem when going to Entity Framework by using /// Apworks specifications. For more information about this solution please /// public static class ExpressionFuncExtender { #region Private Methods private static Expression Compose(this Expression first, Expression second, Func merge) { // build parameter map (from parameters of second to parameters of first) var map = first.Parameters.Select((f, i) => new { f, s = second.Parameters[i] }).ToDictionary(p => p.s, p => p.f); // replace parameters in the second lambda expression with parameters from the first var secondBody = ParameterRebinder.ReplaceParameters(map, second.Body); // apply composition of lambda expression bodies to parameters from the first expression return Expression.Lambda(merge(first.Body, secondBody), first.Parameters); } #endregion #region Public Methods /// /// Combines two given expressions by using the AND semantics. /// /// The type of the object. /// The first part of the expression. /// The second part of the expression. /// The combined expression. public static Expression> And(this Expression> first, Expression> second) { return first.Compose(second, Expression.And); } /// /// Combines two given expressions by using the OR semantics. /// /// The type of the object. /// The first part of the expression. /// The second part of the expression. /// The combined expression. public static Expression> Or(this Expression> first, Expression> second) { return first.Compose(second, Expression.Or); } /// /// 创建一个Lambda表达式 /// /// 实体类型 /// 实体属性 /// 属性值 /// 属性值的数据类型 /// public static Expression> CreateLambda(string prop, object value, Type valueType = null) { var parameter = Expression.Parameter(typeof(T), "t"); Expression property = null; string[] props = prop.Split('.'); for (int i = 0; i < props.Length; i++) { if (property == null) { property = Expression.Property(parameter, props[i]); } else { property = Expression.Property(property, props[i]); } } var body = Expression.Equal(property, valueType != null ? Expression.Constant(value, valueType) : Expression.Constant(value)); var lambda = Expression.Lambda>(body, parameter); return lambda; } /// /// 创建一个Lambda表达式 /// /// 实体类型 /// 实体属性 /// 属性值 /// 属性值的数据类型 /// public static Expression> CreateLambda(Type t, string prop, object value, Type valueType = null) { var parameter = Expression.Parameter(t, "t"); Expression property = null; string[] props = prop.Split('.'); for (int i = 0; i < props.Length; i++) { if (property == null) { property = Expression.Property(parameter, props[i]); } else { property = Expression.Property(property, props[i]); } } var body = Expression.Equal(property, valueType != null ? Expression.Constant(value, valueType) : Expression.Constant(value)); var lambda = Expression.Lambda>(body, Expression.Parameter(typeof(object), "t")); return lambda; } #endregion } }