예제 #1
0
        public static IEnumerable <ICriterion> GetCriterion(ICriteria rootCriteria, ISession session, Expression expression)
        {
            var visitor = new WhereArgumentsVisitor(rootCriteria, session);

            visitor.Visit(expression);
            return(visitor.CurrentCriterions);
        }
        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 ICriterion GetExistsCriteria(MethodCallExpression expr)
        {
            EntityExpression rootEntity   = EntityExpressionVisitor.FirstEntity(expr);
            string           propertyName = MemberNameVisitor.GetMemberName(rootCriteria, expr);

            var rootEntityType = rootEntity.Type;

            if (rootEntity.MetaData.HasProxy)
            {
                rootEntityType = rootEntity.MetaData.GetMappedClass(EntityMode.Poco);
            }

            DetachedCriteria query = DetachedCriteria.For(rootEntityType)
                                     .SetProjection(Projections.Id())
                                     .Add(Restrictions.IsNotEmpty(propertyName));

            if (expr.Arguments.Count > 1)
            {
                var    arg   = (LambdaExpression)LinqUtil.StripQuotes(expr.Arguments[1]);
                string alias = arg.Parameters[0].Name;

                DetachedCriteria subquery = query.CreateCriteria(propertyName, alias);

                var temp = new WhereArgumentsVisitor(subquery.Adapt(session), session);
                temp.Visit(arg.Body);

                foreach (ICriterion c in temp.CurrentCriterions)
                {
                    subquery.Add(c);
                }
            }

            string identifierName = rootEntity.GetAliasedIdentifierPropertyName();

            return(Subqueries.PropertyIn(identifierName, query));
        }
 public static IEnumerable<ICriterion> GetCriterion(ICriteria rootCriteria, ISession session, Expression expression)
 {
     var visitor = new WhereArgumentsVisitor(rootCriteria, session);
     visitor.Visit(expression);
     return visitor.CurrentCriterions;
 }
        private ICriterion GetExistsCriteria(MethodCallExpression expr)
        {
            EntityExpression rootEntity = EntityExpressionVisitor.FirstEntity(expr);
            string propertyName = MemberNameVisitor.GetMemberName(rootCriteria, expr);

            var rootEntityType = rootEntity.Type;
            if (rootEntity.MetaData.HasProxy)
            {
                rootEntityType = rootEntity.MetaData.GetMappedClass(EntityMode.Poco);
            }

            DetachedCriteria query = DetachedCriteria.For(rootEntityType)
                .SetProjection(Projections.Id())
                .Add(Restrictions.IsNotEmpty(propertyName));

            if (expr.Arguments.Count > 1)
            {
                var arg = (LambdaExpression)LinqUtil.StripQuotes(expr.Arguments[1]);
                string alias = arg.Parameters[0].Name;

                DetachedCriteria subquery = query.CreateCriteria(propertyName, alias);

                var temp = new WhereArgumentsVisitor(subquery.Adapt(session), session);
                temp.Visit(arg.Body);

                foreach (ICriterion c in temp.CurrentCriterions)
                {
                    subquery.Add(c);
                }
            }

            string identifierName = rootEntity.GetAliasedIdentifierPropertyName();
            return Subqueries.PropertyIn(identifierName, query);
        }
        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;
        }
예제 #7
0
        protected override Expression VisitMethodCall(MethodCallExpression m)
        {
            if (m.Method.DeclaringType == typeof(Queryable) ||
                m.Method.DeclaringType == typeof(Enumerable))
            {
                switch (m.Method.Name)
                {
                case "Where":
                    WhereArgumentsVisitor vst = new WhereArgumentsVisitor(rootCriteria);
                    System.Linq.Expressions.Expression exp = vst.Visit(m.Arguments[1]);
                    rootCriteria.Add(vst.CurrentCriterions[0]);

                    break;

                case "Select":
                    HandleSelect(m);
                    break;

                case "First":
                    TranslateFirst(m, false);
                    break;

                case "FirstOrDefault":
                    TranslateFirst(m, true);
                    break;

                case "Single":
                    TranslateSingle(m, false);
                    break;

                case "SingleOrDefault":
                    TranslateSingle(m, true);
                    break;

                case "Count":
                    Translation = new CountQueryTranslated(this)
                    {
                        Criteria = rootCriteria
                    };
                    break;

                case "Sum":
                    HandleProjectionOfSingleElement(m, s => NHEX.Projections.Sum(s));
                    break;

                case "Min":
                    HandleProjectionOfSingleElement(m, s => NHEX.Projections.Min(s));
                    break;

                case "Max":
                    HandleProjectionOfSingleElement(m, s => NHEX.Projections.Max(s));
                    break;

                case "Average":
                    HandleProjectionOfSingleElement(m, s => NHEX.Projections.Avg(s));
                    break;

                case "GroupBy":
                    HandleGroupBy(m);
                    break;

                default:
                    Console.WriteLine("Unknown method " + m.Method.Name);
                    break;
                }
            }
            return(base.VisitMethodCall(m));
        }