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); }
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); }
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); }