/// <inheritdoc /> protected override void StartupCore(MethodCallExpression node) { if (node.Method.Name == MethodCall.GroupBy) { int startIndex = 0, removeLength = 0; Workflow(() => { visitor.Visit(node.Arguments[0]); startIndex = writer.AppendAt > -1 ? writer.AppendAt : writer.Length; }, () => { startIndex = writer.Length; writer.GroupBy(); VisitGroupBy(node.Arguments[1]); removeLength = writer.Length - startIndex; }); initGroupVisitor = false; //? GroupBy 总是先行,遇到默认值是,重新生成GroupBy,以确保默认值也纳入分组结果。 if (defaultCache.Count > 0) { writer.Remove(startIndex, removeLength); var index = writer.Length; var length = writer.Length; var appendAt = writer.AppendAt; if (appendAt > -1) { index -= (index - appendAt); } writer.AppendAt = startIndex; writer.GroupBy(); VisitGroupBy(node.Arguments[1]); if (appendAt > -1) { appendAt += writer.Length - length; } writer.AppendAt = appendAt; } } else { base.StartupCore(node); } }
/// <inheritdoc /> protected override void StartupCore(MethodCallExpression node) { writer.Select(); writer.Write(FnName); writer.OpenBrace(); Workflow(() => { visitor.Visit(node.Arguments[1]); writer.CloseBrace(); }, () => visitor.Visit(node.Arguments[0])); }
/// <inheritdoc /> protected override void StartupCore(MethodCallExpression node) { writer.Select(); writer.Write("CASE WHEN "); writer.ReverseCondition(() => { writer.Exists(); writer.OpenBrace(); if (node.Arguments.Count == 1) { visitor.Visit(node.Arguments[0]); } else { visitor.VisitCondition(node); } writer.CloseBrace(); }); writer.Write(" THEN "); writer.BooleanTrue(); writer.Write(" ELSE "); writer.BooleanFalse(); writer.Write(" END"); }
/// <inheritdoc /> protected override void StartupCore(MethodCallExpression node) { writer.Select(); if (node.Arguments.Count == 2) { Workflow(() => VisitMax(node.Arguments[1]), () => visitor.Visit(node.Arguments[0])); } else { Workflow(() => { var tableInfo = MakeTableInfo(node.Arguments[0].Type); var prefix = GetEntryAlias(tableInfo.TableType, string.Empty); WriteMembers(prefix, FilterMembers(tableInfo.ReadOrWrites)); }, () => visitor.Visit(node.Arguments[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; } }
/// <inheritdoc /> protected override void StartupCore(MethodCallExpression node) { writer.Select(); writer.Write(FnName); writer.OpenBrace(); Workflow(() => { var mainExp = node.Arguments[0]; var tableInfo = MakeTableInfo(mainExp.Type); var alias = GetEntryAlias(tableInfo.TableType, string.Empty); if (tableInfo.Keys.Count == 1) { string key = tableInfo.Keys.First(); foreach (var kv in tableInfo.ReadOrWrites) { if (kv.Key == key) { writer.NameDot(alias, kv.Value); break; } } } else { writer.Write("1"); } writer.CloseBrace(); }, () => { if (node.Arguments.Count == 1) { visitor.Visit(node.Arguments[0]); } else { visitor.VisitCondition(node); } }); }
/// <summary> /// 普通Join。 /// </summary> /// <returns></returns> protected virtual void VisitPlainJoin(MethodCallExpression node) { var sb = new StringBuilder(); var rightNode = node.Arguments[1]; Workflow(() => { visitor.Visit(node.Arguments[0]); JoinMode(); WriteTableName(rightNode.Type); }, () => { 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]); } base.Visit(node.Arguments[1]); }); }