private bool CompareFilter(QueryLogicalFilter filter, LogicalOperator logicalOperator, string field, ComparisonOperator comparisonOperator, string value)
 {
     return(filter.Operator == logicalOperator &&
            filter.Filter.Field == field &&
            filter.Filter.Operator == comparisonOperator &&
            Enumerable.SequenceEqual(filter.Filter.Values, (value != null ? value.Split(',') : new string[] { })));
 }
        private Expression BuildInExpression(Expression member, QueryLogicalFilter logicalFilter, bool isIn)
        {
            var typedList      = _listProvider.GetTypedList(logicalFilter.Filter.Values, member.Type, typeof(List <>));
            var listExpression = Expression.Constant(typedList);
            var containsMethod = typedList.GetType().GetMethod("Contains", new Type[] { member.Type });

            return(Expression.Equal(Expression.Call(listExpression, containsMethod, member), Expression.Constant(isIn)));
        }
        private Expression GetPropertyComparisonExpression(Expression member, QueryLogicalFilter logicalFilter)
        {
            object value = ConvertValue(member.Type, logicalFilter.Filter.Values.FirstOrDefault());

            switch (logicalFilter.Filter.Operator)
            {
            case ComparisonOperator.Equal:
                return(Expression.Equal(member, Expression.Convert(Expression.Constant(value), member.Type)));

            case ComparisonOperator.NotEqual:
                return(Expression.NotEqual(member, Expression.Convert(Expression.Constant(value), member.Type)));

            case ComparisonOperator.Greater:
                return(Expression.GreaterThan(member, Expression.Convert(Expression.Constant(value), member.Type)));

            case ComparisonOperator.GreaterOrEqual:
                return(Expression.GreaterThanOrEqual(member, Expression.Convert(Expression.Constant(value), member.Type)));

            case ComparisonOperator.Less:
                return(Expression.LessThan(member, Expression.Convert(Expression.Constant(value), member.Type)));

            case ComparisonOperator.LessOrEqual:
                return(Expression.LessThanOrEqual(member, Expression.Convert(Expression.Constant(value), member.Type)));

            case ComparisonOperator.In:
                return(BuildInExpression(member, logicalFilter, isIn: true));

            case ComparisonOperator.NotIn:
                return(BuildInExpression(member, logicalFilter, isIn: false));

            case ComparisonOperator.Like:
                return(BuildLikeExpression(member, value, isLike: true));

            case ComparisonOperator.NotLike:
                return(BuildLikeExpression(member, value, isLike: false));

            case ComparisonOperator.Null:
                return(Expression.Equal(member, Expression.Constant(null)));

            case ComparisonOperator.NotNull:
                return(Expression.NotEqual(member, Expression.Constant(null)));
            }

            throw new NotImplementedException(nameof(ComparisonOperator));
        }
예제 #4
0
        public void Build_ValidData_PlainFilter()
        {
            var logicalFilters = new QueryLogicalFilter[]
            {
                new QueryLogicalFilter
                {
                    Operator = LogicalOperator.And,
                    Filter   = new QueryComparisonFilter
                    {
                        Field    = "name",
                        Operator = ComparisonOperator.In,
                        Values   = new List <string>
                        {
                            "University of Pennsylvania",
                            "University of Minnesota"
                        }
                    }
                },
                new QueryLogicalFilter
                {
                    Operator = LogicalOperator.Or,
                    Filter   = new QueryComparisonFilter
                    {
                        Field    = "yearofestablishment",
                        Operator = ComparisonOperator.Equal,
                        Values   = new List <string> {
                            "1891"
                        }
                    }
                }
            };

            string expectedPlainFilter = "name" + ComparisonOperator.In.Encoded() + "University of Pennsylvania" + Encoded.COMMA +
                                         "University of Minnesota" + LogicalOperator.Or.Encoded() + "yearofestablishment" + ComparisonOperator.Equal.Encoded() + "1891";

            Assert.Equal(expectedPlainFilter, new PlainFilterBuilder().Build(logicalFilters));
        }
 private Expression AppendExpression(QueryLogicalFilter filter, Expression currentExpression, Expression newExpression)
 {
     return(currentExpression != null ?
            (filter.Operator == LogicalOperator.And ? Expression.AndAlso(currentExpression, newExpression) : Expression.OrElse(currentExpression, newExpression)) :
            newExpression);
 }