private IQueryable <T> AddCollectionContainsToQuery(IQueryable <T> query, T filter, object currentFilterProperty,
                                                            FilterExtensionsAttribute filterExtensionAttribute)
        {
            var property = filter.GetType().GetProperty(filterExtensionAttribute.AppliedToProperty);

            query = ApplyCollectionContains(query, property, currentFilterProperty);

            return(query);
        }
        private IQueryable <T> AddDateTimeRangeToQuery(IQueryable <T> query, T filter, object currentFilterProperty,
                                                       FilterExtensionsAttribute filterExtensionAttribute)
        {
            var dateTimeRange = (DateTimeRange)currentFilterProperty;

            var property = filter.GetType().GetProperty(filterExtensionAttribute.AppliedToProperty);

            query = ApplyGreaterThanOrEqualFilterToQuery(query, property, dateTimeRange.After);
            query = ApplyLessThanOrEqualFilterToQuery(query, property, dateTimeRange.Before);

            return(query);
        }
Beispiel #3
0
        private IQueryable <T> AddNumberRangeToQuery(IQueryable <T> query, T filter, object currentFilterProperty,
                                                     FilterExtensionsAttribute filterExtensionAttribute)
        {
            var range = (NumberRange)currentFilterProperty;

            var property = filter.GetType().GetProperty(filterExtensionAttribute.AppliedToProperty);

            var propertyType = property.PropertyType;

            if (propertyType.IsNullableNumericOrEnumType())
            {
                var underlyingPropertyType = Nullable.GetUnderlyingType(property.PropertyType);

                if (underlyingPropertyType.IsEnum)
                {
                    query = ApplyGreaterThanOrEqualFilterToQuery(query, property,
                                                                 Enum.ToObject(underlyingPropertyType, Convert.ToInt32(Math.Max(range.Min, int.MinValue))));
                    query = ApplyLessThanOrEqualFilterToQuery(query, property,
                                                              Enum.ToObject(underlyingPropertyType, Convert.ToInt32(Math.Min(range.Max, int.MaxValue))));
                }
                else
                {
                    query = ApplyGreaterThanOrEqualFilterToQuery(query, property,
                                                                 Convert.ChangeType(range.Min, underlyingPropertyType));
                    query = ApplyLessThanOrEqualFilterToQuery(query, property,
                                                              Convert.ChangeType(range.Max, underlyingPropertyType));
                }
            }
            else
            {
                if (propertyType.IsEnum)
                {
                    query = ApplyGreaterThanOrEqualFilterToQuery(query, property,
                                                                 Enum.ToObject(propertyType, Convert.ToInt32(Math.Max(range.Min, int.MinValue))));
                    query = ApplyLessThanOrEqualFilterToQuery(query, property,
                                                              Enum.ToObject(propertyType, Convert.ToInt32(Math.Min(range.Max, int.MaxValue))));
                }
                else
                {
                    query = ApplyGreaterThanOrEqualFilterToQuery(query, property, Convert.ChangeType(range.Min, propertyType));
                    query = ApplyLessThanOrEqualFilterToQuery(query, property, Convert.ChangeType(range.Max, propertyType));
                }
            }

            return(query);
        }
Beispiel #4
0
        private IQueryable <T> AddTimeSpanRangeToQuery(IQueryable <T> query, T filter, object currentFilterProperty,
                                                       FilterExtensionsAttribute filterExtensionAttribute)
        {
            var range = (TimeSpanRange)currentFilterProperty;

            var property = filter.GetType().GetProperty(filterExtensionAttribute.AppliedToProperty);

            if (property.PropertyType.IsNullableType())
            {
                // Only do this for nullable TimeSpan types. There's no "nice" way to represent a TimeSpan
                // as a don't care condition without it being nullable, so even if we had a range filter property
                // it would just use the exact value property in the filter every time anyway.

                query = ApplyGreaterThanOrEqualFilterToQuery(query, property,
                                                             Convert.ChangeType(range.Min, Nullable.GetUnderlyingType(property.PropertyType)));
                query = ApplyLessThanOrEqualFilterToQuery(query, property,
                                                          Convert.ChangeType(range.Max, Nullable.GetUnderlyingType(property.PropertyType)));
            }

            return(query);
        }
        private IQueryable <T> AddTimeSpanRangeToQuery(IQueryable <T> query, T filter, object currentFilterProperty,
                                                       FilterExtensionsAttribute filterExtensionAttribute)
        {
            var range = (TimeSpanRange)currentFilterProperty;

            var property = filter.GetType().GetProperty(filterExtensionAttribute.AppliedToProperty);

            if (property.PropertyType.IsNullableType())
            {
                query = ApplyGreaterThanOrEqualFilterToQuery(query, property,
                                                             Convert.ChangeType(range.Min, Nullable.GetUnderlyingType(property.PropertyType)));
                query = ApplyLessThanOrEqualFilterToQuery(query, property,
                                                          Convert.ChangeType(range.Max, Nullable.GetUnderlyingType(property.PropertyType)));
            }
            else
            {
                query = ApplyGreaterThanOrEqualFilterToQuery(query, property, Convert.ChangeType(range.Min, property.PropertyType));
                query = ApplyLessThanOrEqualFilterToQuery(query, property, Convert.ChangeType(range.Max, property.PropertyType));
            }

            return(query);
        }
        private IQueryable <T> AddEnumRangeToQuery(IQueryable <T> query, T filter, object currentFilterProperty,
                                                   FilterExtensionsAttribute filterExtensionAttribute)
        {
            var range = (EnumRange)currentFilterProperty;

            var property = filter.GetType().GetProperty(filterExtensionAttribute.AppliedToProperty);

            if (property.PropertyType.IsNullableNumericType())
            {
                query = ApplyGreaterThanOrEqualFilterToQuery(query, property,
                                                             Enum.ToObject(Nullable.GetUnderlyingType(property.PropertyType), range.Min));
                query = ApplyLessThanOrEqualFilterToQuery(query, property,
                                                          Enum.ToObject(Nullable.GetUnderlyingType(property.PropertyType), range.Min));
            }
            else
            {
                query = ApplyGreaterThanOrEqualFilterToQuery(query, property, Enum.ToObject(property.PropertyType, range.Min));
                query = ApplyLessThanOrEqualFilterToQuery(query, property, Enum.ToObject(property.PropertyType, range.Max));
            }

            return(query);
        }