private static ProjectionInfo AsArithmeticProjection(Expression expression)
        {
            if (!(expression is BinaryExpression be))
            {
                if (expression is UnaryExpression unary && unary.NodeType == ExpressionType.Negate)
                {
                    return(ProjectionInfo.ForProjection(
                               new SqlFunctionProjection(_unaryNegateTemplate, TypeFactory.HeuristicType(unary.Type), FindMemberProjection(unary.Operand).AsProjection())));
                }

                var unwrapExpression = UnwrapConvertExpression(expression);
                return(unwrapExpression != null?AsArithmeticProjection(unwrapExpression) : null);
            }

            if (!_binaryArithmethicTemplates.TryGetValue(be.NodeType, out var template))
            {
                return(null);
            }

            return(ProjectionInfo.ForProjection(
                       new SqlFunctionProjection(
                           template,
                           TypeFactory.HeuristicType(be.Type),
                           FindMemberProjection(be.Left).AsProjection(),
                           FindMemberProjection(be.Right).AsProjection())));
        }
Exemple #2
0
        /// <summary>
        /// Retrieves the projection for the expression
        /// </summary>
        public static ProjectionInfo FindMemberProjection(Expression expression)
        {
            if (!IsMemberExpression(expression))
            {
                return(ProjectionInfo.ForProjection(Projections.Constant(FindValue(expression))));
            }

            var unaryExpression = expression as UnaryExpression;

            if (unaryExpression != null)
            {
                if (!IsConversion(unaryExpression.NodeType))
                {
                    throw new Exception("Cannot interpret member from " + expression);
                }

                return(FindMemberProjection(unaryExpression.Operand));
            }

            var methodCallExpression = expression as MethodCallExpression;

            if (methodCallExpression != null)
            {
                var signature = Signature(methodCallExpression.Method);
                Func <MethodCallExpression, IProjection> processor;
                if (_customProjectionProcessors.TryGetValue(signature, out processor))
                {
                    return(ProjectionInfo.ForProjection(processor(methodCallExpression)));
                }
            }

            return(ProjectionInfo.ForProperty(FindMemberExpression(expression)));
        }
Exemple #3
0
        /// <summary>
        /// Retrieves the projection for the expression
        /// </summary>
        public static ProjectionInfo FindMemberProjection(Expression expression)
        {
            if (!IsMemberExpression(expression))
            {
                return(ProjectionInfo.ForProjection(Projections.Constant(FindValue(expression))));
            }

            if (expression is UnaryExpression)
            {
                UnaryExpression unaryExpression = (UnaryExpression)expression;

                if (!IsConversion(unaryExpression.NodeType))
                {
                    throw new Exception("Cannot interpret member from " + expression.ToString());
                }

                return(FindMemberProjection(unaryExpression.Operand));
            }

            if (expression is MethodCallExpression)
            {
                MethodCallExpression methodCallExpression = (MethodCallExpression)expression;

                string signature = Signature(methodCallExpression.Method);
                if (_customProjectionProcessors.ContainsKey(signature))
                {
                    return(ProjectionInfo.ForProjection(_customProjectionProcessors[signature](methodCallExpression)));
                }
            }

            return(ProjectionInfo.ForProperty(FindMemberExpression(expression)));
        }
        /// <summary>
        /// Retrieves the projection for the expression
        /// </summary>
        public static ProjectionInfo FindMemberProjection(Expression expression)
        {
            if (!IsMemberExpression(expression))
            {
                return(AsArithmeticProjection(expression)
                       ?? ProjectionInfo.ForProjection(Projections.Constant(FindValue(expression), NHibernateUtil.GuessType(expression.Type))));
            }

            var unwrapExpression = UnwrapConvertExpression(expression);

            if (unwrapExpression != null)
            {
                return(FindMemberProjection(unwrapExpression));
            }

            var methodCallExpression = expression as MethodCallExpression;

            if (methodCallExpression != null)
            {
                var signature = Signature(methodCallExpression.Method);
                Func <Expression, IProjection> processor;
                if (_customProjectionProcessors.TryGetValue(signature, out processor))
                {
                    return(ProjectionInfo.ForProjection(processor(methodCallExpression)));
                }
            }
            var memberExpression = expression as MemberExpression;

            if (memberExpression != null)
            {
                var signature = Signature(memberExpression.Member);
                Func <Expression, IProjection> processor;
                if (_customProjectionProcessors.TryGetValue(signature, out processor))
                {
                    return(ProjectionInfo.ForProjection(processor(memberExpression)));
                }
            }

            return(ProjectionInfo.ForProperty(FindMemberExpression(expression)));
        }