FilterDefinition <T> GenerateFilterConditionByType(Type type, PropertySearchExpression propertyExpression) { if (type == typeof(bool) || type == typeof(bool?)) { return(ToDocumentFilter(propertyExpression.Operator, propertyExpression.Property, Convert.ToBoolean(propertyExpression.Value))); } if (type == typeof(int) || type == typeof(int?)) { return(ToDocumentFilter <int>(propertyExpression.Operator, propertyExpression.Property, Convert.ToInt32(propertyExpression.Value))); } if (type == typeof(DateTime) || type == typeof(DateTime?)) { return(ToDocumentFilter(propertyExpression.Operator, propertyExpression.Property, DateTime.Parse(propertyExpression.Value))); } else { return(ToDocumentFilter(propertyExpression.Operator, propertyExpression.Property, propertyExpression.Value)); } }
FilterDefinition <T> GetSearchQuery(SearchExpression searchExpression) { try { if (searchExpression == null) { return(FilterDefinition <T> .Empty); } if (searchExpression is PropertySearchExpression) { var builder = Builders <T> .Filter; // This is necessary to match properties of the format ProcessITTOs.ITTOId. //ProcessITTOs is the main property but MongoDB filter allows projection into properties of objects or arrays. string property = (searchExpression as PropertySearchExpression).Property.Split('.')[0].Trim(); PropertyInfo info = typeof(T).GetProperties().FirstOrDefault(p => p.Name.Trim() == property); if (info != null) { PropertySearchExpression propertySearchExpression = searchExpression as PropertySearchExpression; propertySearchExpression.Property = propertySearchExpression.Property?.Trim().ToLower() == "id" ? "_id" : propertySearchExpression.Property; return(GenerateFilterConditionByType(info.PropertyType, propertySearchExpression)); } return(FilterDefinition <T> .Empty); } else { var expression = searchExpression as BinarySearchExpression <T>; return(ToDocumentBinary(GetSearchQuery(expression.LeftSearch), expression.BinaryOperator, GetSearchQuery(expression.RightSearch))); } } catch (Exception ex) { return(FilterDefinition <T> .Empty); } }