private static Expression GetExpression <T>(Expression param, ListFilter filter) { var member = param; member = filter.PropertyName.Split(".").Aggregate(member, Expression.Property); // takes X.X notation and gets to the nested property member var propertyType = ((PropertyInfo)member.To <MemberExpression>().Member).PropertyType; if (propertyType.GetInterface(nameof(IList)) != null) { var elementType = propertyType.GetTypeInfo().GenericTypeArguments[0]; return(filter.ORExpressions(f => GetListExpression <T>(elementType, member, f))); } if (propertyType.IsEnum || (propertyType.IsNullable() && Nullable.GetUnderlyingType(propertyType).IsEnum)) { return(filter.ORExpressions(f => GetEnumExpression <T>(propertyType, member, f))); } return(filter.ORExpressions(f => GetStringExpression <T>(propertyType, member, f))); }