public static Expression <Func <TSource, bool> > GetFilterExpression <TSource, TFilter>(TFilter filter) { List <ExpressionFilterModel> filters = new List <ExpressionFilterModel>(); PropertyInfo[] filterProps = typeof(TFilter).GetProperties(); foreach (PropertyInfo filterProperty in filterProps) { ExpressionFilterModel expression = new ExpressionFilterModel(); expression.Comparison = FilterComparison.Equal; expression.Value = filterProperty.GetValue(filter); if (expression.Value == null) { continue; } FilterAttribute attribute = (FilterAttribute)filterProperty.GetCustomAttributes(true).Where(x => x.GetType() == typeof(FilterAttribute)).FirstOrDefault(); if (attribute == null || attribute.FilterComparison == FilterComparison.NoFilter) { continue; } expression.Comparison = attribute.FilterComparison; if (attribute.FilterProperty != null) { expression.PropertyName = attribute.FilterProperty; } else { expression.PropertyName = filterProperty.Name; } filters.Add(expression); } return(ConstructAndExpressionTree <TSource>(filters)); }
public static Expression GetExpression <T>(ParameterExpression param, ExpressionFilterModel filter) { if (filter.Value == null) { return(null); } Expression member = Expression.Property(param, filter.PropertyName); Expression constant = Expression.Constant(filter.Value); if (member.Type.Name.ToLower() != "string") { FilterForNullableMember(ref member, ref constant); } BinaryExpression exp = Expression.NotEqual(member, Expression.Constant(null)); Expression next = null; switch (filter.Comparison) { case FilterComparison.Equal: next = Expression.Equal(member, constant); break; case FilterComparison.GreaterThan: next = Expression.GreaterThan(member, constant); break; case FilterComparison.GreaterThanOrEqual: next = Expression.GreaterThanOrEqual(member, constant); break; case FilterComparison.LessThan: next = Expression.LessThan(member, constant); break; case FilterComparison.LessThanOrEqual: next = Expression.LessThanOrEqual(member, constant); break; case FilterComparison.NotEqual: next = Expression.NotEqual(member, constant); break; case FilterComparison.Contains: constant = Expression.Constant(((string)filter.Value).ToLower()); next = Expression.Call(member, containsMethod, constant); break; case FilterComparison.StartsWith: constant = Expression.Constant(((string)filter.Value).ToLower()); next = Expression.Call(member, startsWithMethod, constant); break; case FilterComparison.EndsWith: constant = Expression.Constant(((string)filter.Value).ToLower()); next = Expression.Call(member, endsWithMethod, constant); break; default: return(null); } return(Expression.And(exp, next)); }