/// <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); }); }
/// <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(); }
/// <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; } }
/// <inheritdoc /> public AllVisitor(SelectVisitor visitor) : base(visitor, false) { this.visitor = visitor; }
/// <inheritdoc /> public GroupJoinVisitor(SelectVisitor visitor, ParameterExpression parameter, bool useLeftJoin) : base(visitor) { AnalysisAlias(parameter); this.useLeftJoin = useLeftJoin; }
/// <inheritdoc /> public AnyVisitor(SelectVisitor visitor) : base(visitor) { this.visitor = visitor; }
/// <inheritdoc /> public JoinVisitor(SelectVisitor visitor) : base(visitor, false, ConditionType.And) { this.visitor = visitor; }
/// <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; }
/// <inheritdoc /> public CombinationVisitor(SelectVisitor visitor) : base(visitor, true) { this.visitor = visitor; }