///<summary> /// ///</summary> ///<param name="method"></param> ///<param name="targetObject">Should be an ISecurable</param> ///<param name="arguments">Not sure what the heck arg[0] is, but arg[1] is the entityName</param> ///<param name="treeBuilder"></param> ///<param name="visitor"></param> ///<returns></returns> public override HqlTreeNode BuildHql( MethodInfo method, Expression targetObject, ReadOnlyCollection<Expression> arguments, HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor) { // arguments[0] is a System.Linq.Expressions.Expression // arguments[1] is our constant value var expr = arguments[0]; // This doesn't really help us right now, but log it just in case... if (expr is Remotion.Linq.Clauses.Expressions.QuerySourceReferenceExpression) { Console.WriteLine( "ReferencedQuerySource: {0}", ((Remotion.Linq.Clauses.Expressions.QuerySourceReferenceExpression)expr).ReferencedQuerySource ); } // Getting somewhere? // expr.Type is Spc.Ofp.Tubs.DAL.Entities.Trip Console.WriteLine("Expression type: {0}", expr.Type); // HqlAlias is "AccessControl" (entity property), "ace" (name used in expression) ? // HqlExpression is equality expression ? var aceAlias = treeBuilder.Alias("AccessControl as ace"); var entityName = ((ConstantExpression)arguments[1]).Value; Console.WriteLine("entityName: {0}", entityName); var equality = treeBuilder.Equality( treeBuilder.Alias("ace.EntityName"), treeBuilder.Constant(entityName) ); var joinExpression = treeBuilder.Join(equality, aceAlias); // This doesn't actually do anything... return visitor.Visit(expr).AsExpression(); /* * var dc = DetachedCriteria.For<T>() .CreateAlias("AccessControl", "ace", JoinType.InnerJoin) .Add(NHibernate.Criterion.Expression.Eq("ace.EntityName", this._entityName)); */ }
public override HqlTreeNode BuildHql(MethodInfo method, Expression targetObject, ReadOnlyCollection<Expression> arguments, HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor) { // All has two arguments. Arg 1 is the source and arg 2 is the predicate var predicate = (LambdaExpression) arguments[1]; return treeBuilder.BooleanNot( treeBuilder.Exists( treeBuilder.Query( treeBuilder.SelectFrom( treeBuilder.From( treeBuilder.Range( visitor.Visit(arguments[0]), treeBuilder.Alias(predicate.Parameters[0].Name)) ) ), treeBuilder.Where( treeBuilder.BooleanNot(visitor.Visit(arguments[1]).AsBooleanExpression()) ) ) ) ); }
public override HqlTreeNode BuildHql(MethodInfo method, Expression targetObject, ReadOnlyCollection<Expression> arguments, HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor) { HqlAlias alias = null; HqlWhere where = null; if (arguments.Count > 1) { var expr = (LambdaExpression) arguments[1]; alias = treeBuilder.Alias(expr.Parameters[0].Name); where = treeBuilder.Where(visitor.Visit(arguments[1]).AsExpression()); } return treeBuilder.Exists( treeBuilder.Query( treeBuilder.SelectFrom( treeBuilder.From( treeBuilder.Range( visitor.Visit(arguments[0]), alias) ) ), where)); }
public override HqlTreeNode BuildHql(MethodInfo method, Expression targetObject, ReadOnlyCollection<Expression> arguments, HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor) { // TODO - alias generator HqlAlias alias = treeBuilder.Alias("x"); ParameterExpression param = Expression.Parameter(targetObject.Type, "x"); HqlWhere where = treeBuilder.Where(visitor.Visit(Expression.Lambda( Expression.Equal(param, arguments[0]), param)) .AsExpression()); return treeBuilder.Exists( treeBuilder.Query( treeBuilder.SelectFrom( treeBuilder.From( treeBuilder.Range( visitor.Visit(targetObject), alias) ) ), where)); }