示例#1
0
        public void TestGetExpression_Equal(string key, object value, Type targetType)
        {
            WhereCondition whereCondition = new WhereCondition
            {
                Key       = key,
                Value     = value,
                MatchMode = Enums.EnumMatchMode.Equal
            };
            ParameterExpression parameter  = Expression.Parameter(typeof(User), "u");
            Expression          expression = whereCondition.GetExpression <User>(parameter);


            MemberExpression memberAccessor = Expression.PropertyOrField(parameter, key);

            if (memberAccessor.IsNullableStructMember() && value != null)
            {
                expression = AssertAndAlsoNullCheckExpressionOnLeftReturnRight(expression);
            }


            Assert.NotNull(expression);
            TestOutputHelper.WriteLine(expression.ToString());
            Assert.Equal(ExpressionType.Equal, expression.NodeType);
            AssertDeclarationTypeOfMemberExpressionOnRight(expression, targetType);
        }
示例#2
0
        public void TestGetExpression_Like(string key, object value)
        {
            WhereCondition whereCondition = new WhereCondition
            {
                Key       = key,
                Value     = value,
                MatchMode = Enums.EnumMatchMode.Like
            };
            ParameterExpression parameter  = Expression.Parameter(typeof(User), "u");
            MemberExpression    member     = Expression.PropertyOrField(parameter, key);
            Expression          expression = whereCondition.GetExpression <User>(parameter);

            Assert.NotNull(expression);
            TestOutputHelper.WriteLine(expression.ToString());

            if (!typeof(ValueType).IsAssignableFrom(member.Type) || member.IsNullableStructMember())
            {
                expression = AssertAndAlsoNullCheckExpressionOnLeftReturnRight(expression);
            }


            Assert.NotNull(expression as MethodCallExpression);
            MethodCallExpression methodCallExpression = expression as MethodCallExpression;

            Assert.Equal(Methods.StringContainsMethod, methodCallExpression.Method);
            {
                Expression objExpression = methodCallExpression.Object;
                Assert.NotNull(objExpression as MethodCallExpression);
                MethodCallExpression toLowerMethodCallExpression = objExpression as MethodCallExpression;
                Assert.Equal(Methods.StringToLowerMethod, toLowerMethodCallExpression.Method);
                {
                    objExpression = toLowerMethodCallExpression.Object;
                    if (member.Type != typeof(string))
                    {
                        Assert.NotNull(objExpression as MethodCallExpression);
                        MethodCallExpression toStringMethodCallExpression = objExpression as MethodCallExpression;
                        Assert.Equal(Methods.ObjectToStringMethod, toStringMethodCallExpression.Method);
                        objExpression = toStringMethodCallExpression.Object;
                    }

                    Assert.NotNull(objExpression as MemberExpression);
                }
            }
            {
                Expression objExpression = methodCallExpression.Arguments[0];
                Assert.NotNull(objExpression as MethodCallExpression);
                MethodCallExpression toLowerMethodCallExpression = objExpression as MethodCallExpression;
                Assert.Equal(Methods.StringToLowerMethod, toLowerMethodCallExpression.Method);
                Assert.NotNull(toLowerMethodCallExpression.Object as MemberExpression);
                MemberExpression memberExpression = toLowerMethodCallExpression.Object as MemberExpression;
                Assert.NotNull(memberExpression);
                Type type = memberExpression.Member.DeclaringType;
                Assert.Equal(typeof(ConstantStringWrapper), type);
            }
        }
示例#3
0
        public void TestGetExpression_NotIn(string key, Type targetType, params object[] values)
        {
            WhereCondition whereCondition = new WhereCondition
            {
                Key       = key,
                Value     = values,
                MatchMode = Enums.EnumMatchMode.NotIn
            };

            ParameterExpression parameter  = Expression.Parameter(typeof(User), "u");
            Expression          expression = whereCondition.GetExpression <User>(parameter);

            Assert.NotNull(expression);
            TestOutputHelper.WriteLine(expression.ToString());

            Assert.Equal(ExpressionType.Not, expression.NodeType);
            UnaryExpression exp = expression as UnaryExpression;

            Assert.NotNull(exp);
            Assert.NotNull(exp.Operand);
            expression = exp.Operand;

            MemberExpression memberAccessor = Expression.PropertyOrField(parameter, key);

            if (memberAccessor.IsNullableStructMember())
            {
                expression = AssertAndAlsoNullCheckExpressionOnLeftReturnRight(expression);
            }


            Assert.NotNull(expression as BinaryExpression);
            while (expression is BinaryExpression currentExpress)
            {
                if (currentExpress.NodeType == ExpressionType.Equal)
                {
                    TestOutputHelper.WriteLine("Last Expression is " + currentExpress);
                    AssertDeclarationTypeOfMemberExpressionOnRight(currentExpress, targetType);
                    break;
                }

                Assert.Equal(ExpressionType.OrElse, currentExpress.NodeType);
                expression = currentExpress.Left;
                Expression right = currentExpress.Right;
                TestOutputHelper.WriteLine("Current Right Expression is " + right);
                Assert.Equal(ExpressionType.Equal, right.NodeType);
                AssertDeclarationTypeOfMemberExpressionOnRight(right, targetType);
            }
        }
示例#4
0
        //[InlineData(nameof(User.State), "2", typeof(EnumUserState))]
        public void TestGetExpression_NotBetween(string key, object value1, object value2, Type targetType)
        {
            WhereCondition whereCondition = new WhereCondition
            {
                Key       = key,
                Value     = new[] { value1, value2 },
                MatchMode = Enums.EnumMatchMode.NotBetween
            };

            ParameterExpression parameter  = Expression.Parameter(typeof(User), "u");
            Expression          expression = whereCondition.GetExpression <User>(parameter);

            Assert.NotNull(expression);
            TestOutputHelper.WriteLine(expression.ToString());

            Assert.Equal(ExpressionType.Not, expression.NodeType);
            UnaryExpression exp = expression as UnaryExpression;

            Assert.NotNull(exp);
            Assert.NotNull(exp.Operand);
            expression = exp.Operand;

            MemberExpression memberAccessor = Expression.PropertyOrField(parameter, key);

            if (memberAccessor.IsNullableStructMember())
            {
                expression = AssertAndAlsoNullCheckExpressionOnLeftReturnRight(expression);
            }

            Assert.Equal(ExpressionType.AndAlso, expression.NodeType);
            Assert.NotNull(expression as BinaryExpression);
            Expression leftExpression = (expression as BinaryExpression)?.Left;
            {
                TestOutputHelper.WriteLine($"leftExpression is {expression}");
                Assert.Equal(ExpressionType.GreaterThanOrEqual, leftExpression.NodeType);
                AssertDeclarationTypeOfMemberExpressionOnRight(leftExpression, targetType);
            }
            Expression rihtExpression = (expression as BinaryExpression)?.Right;
            {
                TestOutputHelper.WriteLine($"rihtExpression is {expression}");
                Assert.Equal(ExpressionType.LessThanOrEqual, rihtExpression.NodeType);
                AssertDeclarationTypeOfMemberExpressionOnRight(rihtExpression, targetType);
            }
        }