public System.Linq.Expressions.Expression BuildExpressionForProperty <TEntity, TFilter>(
     ComparerAttribute comparer,
     ParameterExpression parameter,
     PropertyInfo entityProperty,
     PropertyInfo filterProperty,
     TFilter filter)
 {
     return(comparer.BuildExpressionForProperty <TEntity, TFilter>(parameter, entityProperty, filterProperty, filter));
 }
        private ComparerAttribute GetComparerAttribute(PropertyInfo property)
        {
            ComparerAttribute comparerAttribute = property.GetCustomAttribute <ComparerAttribute>(true);

            if (comparerAttribute != null)
            {
                return(comparerAttribute);
            }
            return(new EqualsAttribute());
        }
 public bool ShouldFilterByProperty <TEntity, TFilter>(
     ComparerAttribute comparer,
     PropertyInfo filterProperty,
     PropertyInfo entityProperty,
     TFilter filter)
 {
     if (entityProperty == null)
     {
         return(false);
     }
     return(IsFilterPropertyTypeValidComparable(filterProperty) &&
            FilterAndEntityTypesMatch(filterProperty, entityProperty, comparer) &&
            PropertyHasValue <TFilter>(filterProperty, filter));
 }
        private Stack <System.Linq.Expressions.Expression> StackExpressions <TEntity, TFilter>(TFilter filter, ParameterExpression parameter)
        {
            Stack <System.Linq.Expressions.Expression> expressions = new Stack <System.Linq.Expressions.Expression>();

            foreach (PropertyInfo filterProperty in filter.GetType().GetTypeInfo().GetProperties())
            {
                if (!PropertyHasValue(filterProperty, filter))
                {
                    continue;
                }
                ComparerAttribute comparer = GetComparerAttribute(filterProperty);
                var entityProperty         = comparer.GetEntityProperty <TEntity>(filterProperty);
                if (ShouldFilterByProperty <TEntity, TFilter>(comparer, filterProperty, entityProperty, filter))
                {
                    expressions.Push(BuildExpressionForProperty <TEntity, TFilter>(comparer, parameter, entityProperty, filterProperty, filter));
                }
            }
            return(expressions);
        }
 public virtual bool FilterAndEntityTypesMatch(PropertyInfo filterProperty, PropertyInfo entityProperty, ComparerAttribute comparer)
 {
     return(comparer.FilterAndEntityTypesMatch(filterProperty, entityProperty));
 }