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