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