Esempio n. 1
0
        /// <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);
            }
        }
Esempio n. 2
0
        /// <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]));
        }
Esempio n. 3
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");
        }
Esempio n. 4
0
        /// <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]));
            }
        }
Esempio n. 5
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;
            }
        }
Esempio n. 6
0
        /// <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);
                }
            });
        }
Esempio n. 7
0
        /// <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]);
            });
        }