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