using System; using System.Collections.Generic; using System.Linq.Expressions; namespace JSMachine.WMS.Infrastructure.LambdaHelp { public static class LambdaBuider { public static Expression> BuildExpreesion(FilterCollection filters) { Expression> baseExpression = t => false; if (filters == null || filters.Count == 0) return t => true; List>> orExpressions = new List>>(); for (int i = 0; i < filters.Count; i++) { for (int j = 0; j < filters[i].Count; j++) { string propName = filters[i][j].PropertyName; object value = filters[i][j].Value; switch (filters[i][j].Operation) { case Op.NULL: { if (typeof(T).GetProperty(propName).PropertyType == typeof(int) || typeof(T).GetProperty(propName) == typeof(long)) { baseExpression = baseExpression.Or(LambdaHelper.CreateEqual(propName, 0)); } else { baseExpression = baseExpression.Or(LambdaHelper.Null(propName)); } }; break; case Op.NOTNUL: { if (typeof(T).GetProperty(propName).PropertyType == typeof(int) || typeof(T).GetProperty(propName) == typeof(long)) { baseExpression = baseExpression.Or(LambdaHelper.CreateNotEqual(propName, 0)); } else { baseExpression = baseExpression.Or(LambdaHelper.NotNull(propName)); } }; break; case Op.Equals: baseExpression = baseExpression.Or(LambdaHelper.CreateEqual(propName, value)); break; case Op.NotEquals: baseExpression = baseExpression.Or(LambdaHelper.CreateNotEqual(propName, value)); break; case Op.GreaterThan: baseExpression = baseExpression.Or(LambdaHelper.CreateGreaterThan(propName, value)); break; case Op.LessThan: baseExpression = baseExpression.Or(LambdaHelper.CreateLessThan(propName, value)); break; case Op.GreaterThanOrEqual: baseExpression = baseExpression.Or(LambdaHelper.CreateGreaterThanOrEqual(propName, value)); break; case Op.LessThanOrEqual: baseExpression = baseExpression.Or(LambdaHelper.CreateLessThanOrEqual(propName, value)); break; case Op.Contains: baseExpression = baseExpression.Or(LambdaHelper.GetContains(propName, value)); break; case Op.NotContains: baseExpression = baseExpression.Or(LambdaHelper.GetNotContains(propName, value)); break; case Op.StartsWith: baseExpression = baseExpression.Or(LambdaHelper.GetStartsWith(propName, value)); break; case Op.EndsWith: baseExpression = baseExpression.Or(LambdaHelper.GetEndsWith(propName, value)); break; case Op.In: baseExpression = baseExpression.Or(LambdaHelper.GetIn(propName, value)); break; } } orExpressions.Add(baseExpression); baseExpression = p => false; } Expression> resultExpression = p => true; orExpressions.ForEach(x => { resultExpression = resultExpression.And(x); }); return resultExpression; } } }