public static IQueryable <T> Where <T>(this IQueryable <T> source, FilterWithOperators filter)
        {
            if (filter.Filter == null || filter.Filter.Rules.Count == 0)
            {
                return(source);
            }

            String[] conditionArr = new String[filter.Filter.Rules.Count];
            Object[] parametrArr  = GetParameterArray <T>(filter);

            int parameterNumber = 0;
            int conditionIndex  = 0;

            foreach (var rule in filter.Filter.Rules)
            {
                conditionArr[conditionIndex++] = GetConditionString <T>(rule, filter.FilterOperators, ref parameterNumber);
            }

            string fullCondition = String.Join(
                (filter.Filter.GroupOperator == filter.FilterOperators.AndOperator? " and ": " or "),
                conditionArr
                );

            if (parametrArr == null)
            {
                return(source.Where(String.Format("x => {0}", fullCondition)));
            }

            return(source.Where(String.Format("x => {0}", fullCondition), parametrArr));
        }
        private static Object[] GetParameterArray <T>(FilterWithOperators filter)
        {
            int countOfRulesWithParameter = filter.Filter.Rules.Count(x => x.Operator != filter.FilterOperators.UserDefinedOperator);

            if (countOfRulesWithParameter == 0)
            {
                return(null);
            }

            Object[] parametrArr = new Object[countOfRulesWithParameter];

            int index = 0;

            foreach (var rule in filter.Filter.Rules)
            {
                Type         entityType   = typeof(T);
                PropertyInfo propertyInfo = entityType.GetProperty(rule.PropertyName);
                Type         propertyType = propertyInfo.PropertyType;

                Object propertyValueObject = TypeDescriptor.GetConverter(propertyType).ConvertFrom(rule.PropertyValue);

                parametrArr[index++] = propertyValueObject;
            }
            return(parametrArr);
        }