Exemple #1
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 #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))));
            }

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