private void VisitAddExpression(BinaryExpression expr)
        {
            var leftVisitor  = new SelectArgumentsVisitor(_rootCriteria, _session);
            var rightVisitor = new SelectArgumentsVisitor(_rootCriteria, _session);

            leftVisitor.Visit(expr.Left);
            rightVisitor.Visit(expr.Right);

            var joinedProjections = new List <IProjection>();

            joinedProjections.AddRange(leftVisitor._projections);
            joinedProjections.AddRange(rightVisitor._projections);

            IType[] types     = joinedProjections[0].GetTypes(_rootCriteria, CriteriaQuery);
            var     useConcat = types[0] is AbstractStringType;
            SqlFunctionProjection projection;

            if (useConcat)
            {
                projection = new SqlFunctionProjection("concat", types[0], joinedProjections.ToArray());
            }
            else
            {
                projection = new SqlFunctionProjection(arithmaticAddition, types[0], joinedProjections.ToArray());
            }
            _projections.Add(projection);
        }
        protected override Expression VisitConditional(ConditionalExpression expr)
        {
            var visitorTrue = new SelectArgumentsVisitor(_rootCriteria, _session);

            visitorTrue.Visit(expr.IfTrue);

            var visitorFalse = new SelectArgumentsVisitor(_rootCriteria, _session);

            visitorFalse.Visit(expr.IfFalse);

            var visitorCondition = new WhereArgumentsVisitor(_rootCriteria, _session);

            visitorCondition.Visit(expr.Test);
            Conjunction conjunction = NHibernate.Criterion.Expression.Conjunction();

            foreach (var criterion in visitorCondition.CurrentCriterions)
            {
                conjunction.Add(criterion);
            }

            _projections.Add(
                NHibernate.Criterion.Projections
                .Conditional(conjunction,
                             visitorTrue.Projection,
                             visitorFalse.Projection)
                );

            return(expr);
        }
示例#3
0
        private void HandleSelectManyCall(MethodCallExpression call)
        {
            //get the association path for the joined entity
            var collectionSelector = (LambdaExpression)LinqUtil.StripQuotes(call.Arguments[1]);

            LambdaExpression resultSelector = null;

            if (call.Arguments.Count == 3)
            {
                resultSelector = (LambdaExpression)LinqUtil.StripQuotes(call.Arguments[2]);
                string alias = resultSelector.Parameters[1].Name;

                var visitor = new SelectManyVisitor(rootCriteria, alias);
                visitor.Visit(collectionSelector.Body);
            }

            if (resultSelector != null)
            {
                //visit the result selector expression after the alias for the association has been created
                var resultSelectorVisitor = new SelectArgumentsVisitor(rootCriteria, session);
                resultSelectorVisitor.Visit(resultSelector.Body);

                rootCriteria.SetProjectionIfNotNull(resultSelectorVisitor.Projection);
                rootCriteria.SetResultTransformerIfNotNull(resultSelectorVisitor.Transformer);
            }
        }
示例#4
0
        private void HandleSelectCall(MethodCallExpression call)
        {
            var lambda = (LambdaExpression)LinqUtil.StripQuotes(call.Arguments[1]);

            var visitor = new SelectArgumentsVisitor(rootCriteria, session);

            visitor.Visit(lambda.Body);

            rootCriteria.SetProjectionIfNotNull(visitor.Projection);
            rootCriteria.SetResultTransformerIfNotNull(visitor.Transformer);
        }
示例#5
0
 private void HandleSelectMethodCall(MethodCallExpression call)
 {
     if (SelectArgumentsVisitor.SupportsMethod(call.Method.Name))
     {
         var projectionVisitor = new SelectArgumentsVisitor(rootCriteria, session);
         projectionVisitor.Visit(call);
         rootCriteria.SetProjection(projectionVisitor.Projection);
     }
     else
     {
         throw new NotImplementedException();
     }
 }
        private void VisitAritmaticOperation(BinaryExpression expr, ISQLFunction arithmaticOperation)
        {
            var leftVisitor  = new SelectArgumentsVisitor(_rootCriteria, _session);
            var rightVisitor = new SelectArgumentsVisitor(_rootCriteria, _session);

            leftVisitor.Visit(expr.Left);
            rightVisitor.Visit(expr.Right);

            var joinedProjections = new List <IProjection>();

            joinedProjections.AddRange(leftVisitor._projections);
            joinedProjections.AddRange(rightVisitor._projections);
            var types      = joinedProjections[0].GetTypes(_rootCriteria, CriteriaQuery);
            var projection = new SqlFunctionProjection(arithmaticOperation, types[0], joinedProjections.ToArray());

            _projections.Add(projection);
        }
        protected override Expression VisitUnary(UnaryExpression expr)
        {
            if (expr.NodeType == ExpressionType.Convert)
            {
                var visitor = new SelectArgumentsVisitor(_rootCriteria, _session);
                visitor.Visit(expr.Operand);

                ProjectionList list = NHProjections.ProjectionList();
                foreach (IProjection proj in visitor._projections)
                {
                    list.Add(proj);
                }

                var projection = new CastProjection(NHibernateUtil.GuessType(expr.Type), list);
                _projections.Add(projection);
            }

            return(expr);
        }
        private T HandleAggregateCall(MethodCallExpression call)
        {
            var visitor = new SelectArgumentsVisitor(rootCriteria, session);

            visitor.Visit(call);

            T value = default(T);

            if (visitor.Projection != null)
            {
                object result = rootCriteria.SetProjection(visitor.Projection).UniqueResult();
                if (result != null)
                {
                    value = (T)LinqUtil.ChangeType(result, typeof(T));
                }
            }

            return(value);
        }
		protected override Expression VisitMethodCall(MethodCallExpression expr)
		{
			Type = BinaryCriterionType.Criteria;

			//TODO: don't hardcode this alias 'sub'
			Criteria = DetachedCriteria.ForEntityName(rootCriteria.GetEntityOrClassName(), "sub");

			EntityExpression rootEntity = EntityExpressionVisitor.RootEntity(expr);
			if (rootEntity != null)
			{
				string identifierName = rootEntity.MetaData.IdentifierPropertyName;
				Criteria.Add(Restrictions.EqProperty(rootCriteria.Alias + "." + identifierName, "sub." + identifierName));
			}

			if (SelectArgumentsVisitor.SupportsMethod(expr.Method.Name))
			{
				var projectionVisitor = new SelectArgumentsVisitor(Criteria.Adapt(session), session);
				projectionVisitor.Visit(expr);
				Criteria.SetProjection(projectionVisitor.Projection);
			}

			return expr;
		}
示例#10
0
        private void HandleSelectManyCall(MethodCallExpression call)
        {
            //get the association path for the joined entity
            var collectionSelector = (LambdaExpression)LinqUtil.StripQuotes(call.Arguments[1]);

            LambdaExpression resultSelector = null;
            if (call.Arguments.Count == 3)
            {
                resultSelector = (LambdaExpression)LinqUtil.StripQuotes(call.Arguments[2]);
                string alias = resultSelector.Parameters[1].Name;

                var visitor = new SelectManyVisitor(rootCriteria, alias);
                visitor.Visit(collectionSelector.Body);
            }

            if (resultSelector != null)
            {
                //visit the result selector expression after the alias for the association has been created
                var resultSelectorVisitor = new SelectArgumentsVisitor(rootCriteria, session);
                resultSelectorVisitor.Visit(resultSelector.Body);

                rootCriteria.SetProjectionIfNotNull(resultSelectorVisitor.Projection);
                rootCriteria.SetResultTransformerIfNotNull(resultSelectorVisitor.Transformer);
            }
        }
示例#11
0
        private void HandleSelectMethodCall(MethodCallExpression call)
        {
            if (SelectArgumentsVisitor.SupportsMethod(call.Method.Name))
            {
                var projectionVisitor = new SelectArgumentsVisitor(rootCriteria, session);
                projectionVisitor.Visit(call);

                if (_Log.IsDebugEnabled)
                {
                    if (projectionVisitor.Projection != null)
                        _Log.DebugFormat("Translated projection: {0}", projectionVisitor.Projection.ToString());
                }

                rootCriteria.SetProjection(projectionVisitor.Projection);
            }
            else
            {
                throw new NotImplementedException();
            }
        }
        protected override Expression VisitUnary(UnaryExpression expr)
        {
            if (expr.NodeType == ExpressionType.Convert)
            {
                var visitor = new SelectArgumentsVisitor(_rootCriteria, _session);
                visitor.Visit(expr.Operand);

                ProjectionList list = NHProjections.ProjectionList();
                foreach (IProjection proj in visitor._projections)
                    list.Add(proj);

                var projection = new CastProjection(NHibernateUtil.GuessType(expr.Type), list);
                _projections.Add(projection);
            }

            return expr;
        }
示例#13
0
        private void HandleSelectCall(MethodCallExpression call)
        {
            var lambda = (LambdaExpression)LinqUtil.StripQuotes(call.Arguments[1]);

            var visitor = new SelectArgumentsVisitor(rootCriteria, session);
            visitor.Visit(lambda.Body);

            if (_Log.IsDebugEnabled)
            {
                if (visitor.Projection != null)
                    _Log.DebugFormat("Translated projection: {0}", visitor.Projection.ToString());
            }

            rootCriteria.SetProjectionIfNotNull(visitor.Projection);
            rootCriteria.SetResultTransformerIfNotNull(visitor.Transformer);
        }
        private void VisitAddExpression(BinaryExpression expr)
        {
            var leftVisitor = new SelectArgumentsVisitor(_rootCriteria, _session);
            var rightVisitor = new SelectArgumentsVisitor(_rootCriteria, _session);
            leftVisitor.Visit(expr.Left);
            rightVisitor.Visit(expr.Right);

            var joinedProjections = new List<IProjection>();
            joinedProjections.AddRange(leftVisitor._projections);
            joinedProjections.AddRange(rightVisitor._projections);

            IType[] types = joinedProjections[0].GetTypes(_rootCriteria, CriteriaQuery);
            var useConcat = types[0] is AbstractStringType;
            SqlFunctionProjection projection;
            if (useConcat)
            {
                projection = new SqlFunctionProjection("concat", types[0], joinedProjections.ToArray());
            }
            else
            {
                projection = new SqlFunctionProjection(arithmaticAddition, types[0], joinedProjections.ToArray());
            }
            _projections.Add(projection);
        }
        private void VisitAritmaticOperation(BinaryExpression expr, ISQLFunction arithmaticOperation)
        {
            var leftVisitor = new SelectArgumentsVisitor(_rootCriteria, _session);
            var rightVisitor = new SelectArgumentsVisitor(_rootCriteria, _session);
            leftVisitor.Visit(expr.Left);
            rightVisitor.Visit(expr.Right);

            var joinedProjections = new List<IProjection>();
            joinedProjections.AddRange(leftVisitor._projections);
            joinedProjections.AddRange(rightVisitor._projections);
            var types = joinedProjections[0].GetTypes(_rootCriteria, CriteriaQuery);
            var projection = new SqlFunctionProjection(arithmaticOperation, types[0], joinedProjections.ToArray());
            _projections.Add(projection);
        }
示例#16
0
 private void HandleSelectMethodCall(MethodCallExpression call)
 {
     if (SelectArgumentsVisitor.SupportsMethod(call.Method.Name))
     {
         var projectionVisitor = new SelectArgumentsVisitor(rootCriteria, session);
         projectionVisitor.Visit(call);
         rootCriteria.SetProjection(projectionVisitor.Projection);
     }
     else
     {
         throw new NotImplementedException();
     }
 }
示例#17
0
        private void HandleSelectCall(MethodCallExpression call)
        {
            var lambda = (LambdaExpression)LinqUtil.StripQuotes(call.Arguments[1]);

            var visitor = new SelectArgumentsVisitor(rootCriteria, session);
            visitor.Visit(lambda.Body);

            rootCriteria.SetProjectionIfNotNull(visitor.Projection);
            rootCriteria.SetResultTransformerIfNotNull(visitor.Transformer);
        }
        protected override Expression VisitConditional(ConditionalExpression expr)
        {
            var visitorTrue = new SelectArgumentsVisitor(_rootCriteria, _session);
            visitorTrue.Visit(expr.IfTrue);

            var visitorFalse = new SelectArgumentsVisitor(_rootCriteria, _session);
            visitorFalse.Visit(expr.IfFalse);

            var visitorCondition = new WhereArgumentsVisitor(_rootCriteria, _session);
            visitorCondition.Visit(expr.Test);
            Conjunction conjunction = NHibernate.Criterion.Expression.Conjunction();
            foreach (var criterion in visitorCondition.CurrentCriterions)
            {
                conjunction.Add(criterion);
            }

            _projections.Add(
                NHibernate.Criterion.Projections
                    .Conditional(conjunction,
                        visitorTrue.Projection,
                        visitorFalse.Projection)
                        );

            return expr;
        }