예제 #1
0
        /// <summary>
        /// 复杂Join。
        /// </summary>
        /// <returns></returns>
        protected virtual void VisitComplexJoin(MethodCallExpression node)
        {
            var sb = new StringBuilder();

            var rightNode = node.Arguments[1];

            Workflow(() =>
            {
                visitor.Visit(node.Arguments[0]);

                JoinMode();

                writer.OpenBrace();

                using (var visitor = new SelectVisitor(this))
                {
                    visitor.Startup(rightNode);
                }

                writer.CloseBrace();

                writer.WhiteSpace();

                writer.Name(GetEntryAlias(rightNode.Type, string.Empty));
            }, () =>
            {
                writer.Write(" ON ");

                if (IsNewEquals(node.Arguments[2]))
                {
                    buildNewEqual = true;

                    base.Visit(node.Arguments[3]);

                    buildNewEqual = false;

                    base.Visit(node.Arguments[2]);
                }
                else
                {
                    visitor.Visit(node.Arguments[2]);

                    writer.Equal();

                    base.Visit(node.Arguments[3]);
                }

                rightNode = JoinWhereMethod(rightNode);
            });
        }
예제 #2
0
        /// <inheritdoc />
        protected override void StartupCore(MethodCallExpression node)
        {
            base.Visit(node.Arguments[1]);

            writer.Contains();

            writer.OpenBrace();

            using (var visitor = new SelectVisitor(this))
            {
                visitor.Startup(node.Arguments[0]);
            }

            writer.CloseBrace();
        }
예제 #3
0
        /// <inheritdoc />
        protected override void VisitCore(MethodCallExpression node)
        {
            switch (node.Method.Name)
            {
            case MethodCall.Any:
                using (var visitor = new NestedAnyVisitor(this.visitor))
                {
                    visitor.Startup(node);
                }
                break;

            case MethodCall.All:
                using (var visitor = new NestedAllVisitor(this.visitor))
                {
                    visitor.Startup(node);
                }
                break;

            case MethodCall.Contains:
                using (var visitor = new NestedContainsVisitor(this.visitor))
                {
                    visitor.Startup(node);
                }
                break;

            case MethodCall.Select:
                using (var visitor = new SelectVisitor(this.visitor))
                {
                    writer.OpenBrace();

                    visitor.Startup(node);

                    writer.CloseBrace();
                }
                break;

            default:
                if (node.Type.IsValueType || node.Type == Types.String || !node.Type.IsQueryable())
                {
                    goto case MethodCall.Select;
                }

                visitor.Visit(node);

                break;
            }
        }
예제 #4
0
 /// <inheritdoc />
 public AllVisitor(SelectVisitor visitor) : base(visitor, false)
 {
     this.visitor = visitor;
 }
예제 #5
0
        /// <inheritdoc />
        public GroupJoinVisitor(SelectVisitor visitor, ParameterExpression parameter, bool useLeftJoin) : base(visitor)
        {
            AnalysisAlias(parameter);

            this.useLeftJoin = useLeftJoin;
        }
예제 #6
0
 /// <inheritdoc />
 public AnyVisitor(SelectVisitor visitor) : base(visitor)
 {
     this.visitor = visitor;
 }
예제 #7
0
 /// <inheritdoc />
 public JoinVisitor(SelectVisitor visitor) : base(visitor, false, ConditionType.And)
 {
     this.visitor = visitor;
 }
예제 #8
0
 /// <inheritdoc />
 public GroupByVisitor(SelectVisitor visitor, Dictionary <Tuple <Type, string>, Expression> defaultCache, Dictionary <MemberInfo, Expression> groupByExpressions) : base(visitor, false, ConditionType.Having)
 {
     this.visitor            = visitor;
     this.defaultCache       = defaultCache;
     this.groupByExpressions = groupByExpressions;
 }
예제 #9
0
 /// <inheritdoc />
 public CombinationVisitor(SelectVisitor visitor) : base(visitor, true)
 {
     this.visitor = visitor;
 }