Example #1
0
        internal override ExpressionMetadata Convert(Expression expression, ExpressionModelMetadata modelMetadata)
        {
            if (!(expression is MethodCallExpression methodCallExpression))
            {
                throw new ExpressionConvertException();
            }

            if (methodCallExpression.Object == null &&
                TryGetExpressionMethodConverter(methodCallExpression, out var expressionMethodConverter))
            {
                return(expressionMethodConverter.Convert(methodCallExpression, modelMetadata));
            }

            if (methodCallExpression.Object != null && IsColumnPathMember(methodCallExpression.Object, modelMetadata) &&
                TryGetPropertyMethodConverter(methodCallExpression, out var propertyMethodConverter))
            {
                return(propertyMethodConverter.Convert(methodCallExpression, modelMetadata));
            }

            if (methodCallExpression.Object != null && !IsColumnPathMember(methodCallExpression.Object, modelMetadata) &&
                TryGetFieldMethodConverter(methodCallExpression, out var fieldMethodConverter))
            {
                return(fieldMethodConverter.Convert(methodCallExpression, modelMetadata));
            }

            if (TryDynamicInvoke(expression, out var value))
            {
                return(GetPropertyMetadata(expression, value));
            }

            throw new ExpressionConvertException();
        }
 internal override ExpressionMetadata Convert(Expression expression, ExpressionModelMetadata modelMetadata)
 {
     if (TryDynamicInvoke(expression, out var value))
     {
         return(GetPropertyMetadata(expression, value));
     }
     throw new NotSupportedException();
 }
Example #3
0
        internal override ExpressionMetadata Convert(Expression expression, ExpressionModelMetadata modelMetadata)
        {
            if (!(expression is LambdaExpression lambdaExpression))
            {
                throw new ExpressionConvertException();
            }

            throw new NotImplementedException();
        }
        internal override ExpressionMetadata Convert(Expression expression, ExpressionModelMetadata modelMetadata)
        {
            var body = GetExpressionBody(expression);

            if (IsColumnPathMember(body, modelMetadata))
            {
                return(GetColumnPathMetadata(body, modelMetadata));
            }
            throw new NotSupportedException();
        }
Example #5
0
        internal override ExpressionMetadata Convert(Expression expression, ExpressionModelMetadata modelMetadata)
        {
            if (!(expression is MethodCallExpression methodCallExpression))
            {
                throw new ExpressionConvertException();
            }

            return(methodCallExpression.Arguments.Count > 1
                                ? base.Convert(expression, modelMetadata)
                                : GenerateGroup(LogicalOperationStrict.And));
        }
Example #6
0
 protected static ExpressionMetadata GetColumnPathMetadata(Expression node, ExpressionModelMetadata modelMetadata)
 {
     return(new ExpressionMetadata()
     {
         NodeType = ExpressionMetadataNodeType.Column,
         Parameter = new ExpressionMetadataParameter()
         {
             Type = node.Type,
             ColumnPath = GetColumnPath(node, modelMetadata)
         }
     });
 }
Example #7
0
        internal static ExpressionMetadata GenerateFilterElementExpression(Expression expression,
                                                                           ExpressionModelMetadata modelMetadata)
        {
            if (TryDynamicInvoke(expression, out var value))
            {
                return(GetPropertyMetadata(expression, value));
            }
            if (IsDetailPathMember(expression, modelMetadata))
            {
                throw new NotSupportedException();
            }

            return(ConvertModelQueryExpression(expression, modelMetadata));
        }
Example #8
0
 internal override ExpressionMetadata Convert(Expression expression, ExpressionModelMetadata modelMetadata)
 {
     if (TryDynamicInvoke(expression, out var value))
     {
         return(GetPropertyMetadata(expression, value));
     }
     if (expression is UnaryExpression unaryExpression)
     {
         var response = ConvertModelQueryExpression(unaryExpression.Operand, modelMetadata);
         response.IsNot = true;
         return(response);
     }
     throw new NotImplementedException();
 }
 internal override ExpressionMetadata Convert(Expression expression, ExpressionModelMetadata modelMetadata)
 {
     if (TryDynamicInvoke(expression, out var value))
     {
         return(GetPropertyMetadata(expression, value));
     }
     if (expression is UnaryExpression unaryExpression)
     {
         if (IsColumnPathMember(unaryExpression.Operand, modelMetadata))
         {
             return(GetColumnPathMetadata(unaryExpression.Operand, modelMetadata));
         }
     }
     throw new NotImplementedException();
 }
Example #10
0
        internal override ExpressionMetadata Convert(Expression expression, ExpressionModelMetadata modelMetadata)
        {
            if (!(expression is MethodCallExpression methodCallExpression) || methodCallExpression.Arguments.Count < 1)
            {
                throw new ExpressionConvertException();
            }

            var left = ComparisonExpressionConverter.GenerateFilterElementExpression(
                methodCallExpression.Arguments.First(), modelMetadata);
            var valueType        = left.Parameter.Type;
            var valueList        = GetRightValuesList(methodCallExpression.Object, GetType(), valueType);
            var rightExpressions = valueList.Select(value => GetPropertyMetadata(valueType, value)).ToArray();

            return(ComparisonExpressionConverter.GenerateComparisonExpressionMetadata(left, FilterComparisonType.Equal, rightExpressions));
        }
        internal override ExpressionMetadata Convert(Expression expression, ExpressionModelMetadata modelMetadata)
        {
            if (!(expression is MethodCallExpression methodCallExpression) || methodCallExpression.Arguments.Count < 2)
            {
                throw new ExpressionConvertException();
            }

            var body = methodCallExpression.Arguments.Skip(1).First();

            if (TryDynamicInvoke(body, out var value))
            {
                return(GetPropertyMetadata(body, value));
            }
            throw new NotSupportedException();
        }
Example #12
0
        protected static bool IsColumnPathMember(Expression node, ExpressionModelMetadata modelMetadata)
        {
            if (node is MemberExpression memberNode)
            {
                if (memberNode.Member.DeclaringType == null || !(memberNode.Member.DeclaringType == typeof(BaseModel) || memberNode.Member.DeclaringType.IsSubclassOf(typeof(BaseModel))))
                {
                    return(false);
                }
                return(IsColumnPathMember(memberNode.Expression, modelMetadata));
            }

            if (node is ParameterExpression parameterExpression)
            {
                return(parameterExpression.Name == modelMetadata.Name && parameterExpression.Type == modelMetadata.Type);
            }
            return(false);
        }
Example #13
0
        internal override ExpressionMetadata Convert(Expression expression, ExpressionModelMetadata modelMetadata)
        {
            if (!(expression is MemberExpression memberExpression))
            {
                throw new ExpressionConvertException();
            }

            if (IsColumnPathMember(memberExpression, modelMetadata))
            {
                return(GetColumnPathMetadata(memberExpression, modelMetadata));
            }

            if (TryDynamicInvoke(memberExpression, out var value))
            {
                return(GetPropertyMetadata(memberExpression, value));
            }

            return(null);
        }
Example #14
0
        protected static bool IsDetailPathMember(Expression node, ExpressionModelMetadata modelMetadata)
        {
            if (node is MethodCallExpression methodCallExpression)
            {
                if (methodCallExpression.Arguments.Count > 0)
                {
                    return(IsDetailPathMember(methodCallExpression.Arguments.First(), modelMetadata));
                }
                return(false);
            }

            if (node is MemberExpression memberNode && memberNode.Member.DeclaringType != null &&
                (memberNode.Member.DeclaringType == typeof(BaseModel) ||
                 memberNode.Member.DeclaringType.IsSubclassOf(typeof(BaseModel))) &&
                IsColumnPathMember(memberNode.Expression, modelMetadata))
            {
                return(IsDetailMember(memberNode.Member));
            }

            return(false);
        }
Example #15
0
        internal override ExpressionMetadata Convert(Expression expression, ExpressionModelMetadata modelMetadata)
        {
            if (!(expression is MethodCallExpression methodCallExpression) || methodCallExpression.Arguments.Count != 2)
            {
                throw new ExpressionConvertException();
            }

            var argumentExpression = methodCallExpression.Arguments.Skip(1).First();

            if (!(argumentExpression is UnaryExpression unaryExpression))
            {
                throw new ExpressionConvertException();
            }
            if (!(unaryExpression.Operand is LambdaExpression lambdaExpression))
            {
                throw new ExpressionConvertException();
            }

            var innerExpression = lambdaExpression.Body;

            return(ConvertExpression(innerExpression, modelMetadata));
        }
Example #16
0
 private static ExpressionMetadata ConvertExpression(Expression expression, ExpressionModelMetadata modelMetadata)
 {
     if (expression is BinaryExpression binaryExpression)
     {
         return(ConvertBinaryExpressionMetadata(binaryExpression, modelMetadata));
     }
     if (IsDetailPathMember(expression, modelMetadata))
     {
         throw new NotSupportedException();
     }
     if (expression is MethodCallExpression methodCallExpression)
     {
         var converter = GetExpressionConverter(typeof(MethodCallExpressionConverter));
         return(converter.Convert(methodCallExpression, modelMetadata));
     }
     if (expression is UnaryExpression unaryExpression && unaryExpression.NodeType == ExpressionType.Not)
     {
         var response = ConvertExpression(unaryExpression.Operand, modelMetadata);
         return(ApplyNot(response));
     }
     return(ConvertUnaryExpressionMetadata(expression, modelMetadata));
 }
Example #17
0
        internal static ExpressionMetadata ConvertModelQueryExpression(Expression expression, ExpressionModelMetadata modelMetadata)
        {
            ExpressionConverter expressionConverter = null;

            if (expression.NodeType == ExpressionType.Call)
            {
                expressionConverter = GetExpressionConverter <MethodCallExpressionConverter>();
            }
            if (expression.NodeType == ExpressionType.Lambda)
            {
                expressionConverter = GetExpressionConverter <LambdaExpressionConverter>();
            }
            if (expression.NodeType == ExpressionType.MemberAccess)
            {
                expressionConverter = GetExpressionConverter <MemberAccessExpressionConverter>();
            }
            if (expression.NodeType == ExpressionType.Constant)
            {
                expressionConverter = GetExpressionConverter <ConstantExpressionConverter>();
            }
            if (expression.NodeType == ExpressionType.Convert)
            {
                expressionConverter = GetExpressionConverter <ConvertExpressionConverter>();
            }
            if (expression.NodeType == ExpressionType.Not)
            {
                expressionConverter = GetExpressionConverter <NotExpressionConverter>();
            }

            if (expressionConverter == null)
            {
                throw new NotImplementedException();
            }

            return(expressionConverter.Convert(expression, modelMetadata));
        }
Example #18
0
 internal abstract ExpressionMetadata Convert(Expression expression, ExpressionModelMetadata modelMetadata);
Example #19
0
        private static string GetColumnPath(Expression node, ExpressionModelMetadata modelMetadata)
        {
            var chainList = GetColumnPathChainList(node);

            return(ModelUtilities.GetColumnPath(modelMetadata.Type, chainList));
        }
Example #20
0
        private static ExpressionMetadata CreateBinaryComparisonExpressionMetadata(BinaryExpression binaryExpression, ExpressionModelMetadata modelMetadata)
        {
            if (GroupOperations.Contains(binaryExpression.NodeType))
            {
                return(ConvertExpressionGroup(binaryExpression, modelMetadata));
            }
            var comparisonType          = GetComparisonType(binaryExpression.NodeType);
            var leftExpressionMetadata  = GenerateFilterElementExpression(binaryExpression.Left, modelMetadata);
            var rightExpressionMetadata = GenerateFilterElementExpression(binaryExpression.Right, modelMetadata);

            return(CanBeConvertedAsIsNullComparison(leftExpressionMetadata, comparisonType, rightExpressionMetadata)
                                ? GenerateIsNullExpressionMetadata(leftExpressionMetadata, comparisonType)
                                : GenerateComparisonExpressionMetadata(leftExpressionMetadata, comparisonType,
                                                                       rightExpressionMetadata));
        }
Example #21
0
        internal static ExpressionMetadata GenerateComparisonExpressionMetadata(Expression left,
                                                                                FilterComparisonType comparisonType, ExpressionModelMetadata modelMetadata, params Expression[] rights)
        {
            var leftExpressionMetadata      = GenerateFilterElementExpression(left, modelMetadata);
            var rightExpressionMetadataList =
                rights.Select(right => GenerateFilterElementExpression(right, modelMetadata)).ToArray();

            return(GenerateComparisonExpressionMetadata(leftExpressionMetadata, comparisonType,
                                                        rightExpressionMetadataList));
        }
Example #22
0
        private static ExpressionMetadata ConvertBinaryExpressionMetadata(BinaryExpression binaryExpression, ExpressionModelMetadata modelMetadata)
        {
            var nodeType = binaryExpression.NodeType;

            return(GroupOperations.Contains(binaryExpression.NodeType)
                                ? ConvertExpressionGroup(binaryExpression, modelMetadata)
                                : CreateBinaryComparisonExpressionMetadata(binaryExpression, modelMetadata));
        }
Example #23
0
        private static ExpressionMetadata ConvertExpressionGroup(BinaryExpression binaryExpression, ExpressionModelMetadata modelMetadata)
        {
            var logicalOperation        = GetLogicalOperation(binaryExpression.NodeType);
            var groupExpressionMetadata = GenerateGroup(logicalOperation);

            groupExpressionMetadata.Items.Add(ConvertExpression(binaryExpression.Left, modelMetadata));
            groupExpressionMetadata.Items.Add(ConvertExpression(binaryExpression.Right, modelMetadata));
            return(groupExpressionMetadata);
        }
Example #24
0
        private static ExpressionMetadata ConvertUnaryExpressionMetadata(Expression left, ExpressionModelMetadata modelMetadata)
        {
            var leftExpressionMetadata  = GenerateFilterElementExpression(left, modelMetadata);
            var rightExpressionMetadata = GetPropertyMetadata(typeof(bool), true);
            var comparisonType          = leftExpressionMetadata.IsNot
                                ? FilterComparisonType.NotEqual
                                : FilterComparisonType.Equal;

            return(GenerateComparisonExpressionMetadata(leftExpressionMetadata, comparisonType,
                                                        rightExpressionMetadata));
        }