Example #1
0
        public void EmptyTest()
        {
            Emptyable.Register(typeof(IEmptyA <>), typeof(EmptyB <>)); //? 接口注册。
            Emptyable.Register(typeof(EmptyA <>), typeof(EmptyC <>));  //? 抽象类注册。

            var i  = Emptyable.Empty <int>();
            var e  = Emptyable.Empty <DateTimeKind>();
            var d  = Emptyable.Empty <DateTime>();
            var s  = Emptyable.Empty <string>();
            var c  = Emptyable.Empty <CopyTest>();                //? 默认构造函数。
            var nc = Emptyable.Empty <NonPublicConstructor>();    //? 私有构造函数。
            var na = Emptyable.Empty <HasArgumentsConstructor>(); //? 有参数构造函数。

            var ng  = Emptyable.Empty <IEmptyA <int> >();
            var ng2 = Emptyable.Empty <EmptyA <string> >();
        }
Example #2
0
        /// <inheritdoc />
        protected override void StartupCore(MethodCallExpression node)
        {
            switch (node.Method.Name)
            {
            case MethodCall.Count when node.Arguments.Count == 2:
            case MethodCall.LongCount when node.Arguments.Count == 2:
                writer.Write("COUNT");
                writer.OpenBrace();
                writer.Write("CASE WHEN ");

                VisitCondition(node);

                writer.Write(" THEN 1 ELSE 0 END");
                writer.CloseBrace();
                break;

            case MethodCall.Count when node.Arguments[0].NodeType == ExpressionType.Parameter:
            case MethodCall.LongCount when node.Arguments[0].NodeType == ExpressionType.Parameter:

                writer.Write("COUNT(1)");

                break;

            case MethodCall.Count:
            case MethodCall.LongCount:

                writer.Write("COUNT");
                writer.OpenBrace();
                writer.Write("CASE WHEN ");

                Visit(node.Arguments[0]);

                writer.Write(" THEN 1 ELSE 0 END");
                writer.CloseBrace();

                break;

            case MethodCall.Sum when node.Arguments.Count == 2 && node.Arguments[0].NodeType == ExpressionType.Parameter:
            case MethodCall.Max when node.Arguments.Count == 2 && node.Arguments[0].NodeType == ExpressionType.Parameter:
            case MethodCall.Min when node.Arguments.Count == 2 && node.Arguments[0].NodeType == ExpressionType.Parameter:
            case MethodCall.Average when node.Arguments.Count == 2 && node.Arguments[0].NodeType == ExpressionType.Parameter:

                writer.Write(node.Method.Name == MethodCall.Average ? "AVG" : node.Method.Name.ToUpper());

                writer.OpenBrace();

                Visit(node.Arguments[1]);

                writer.CloseBrace();

                break;

            case MethodCall.Sum when node.Arguments.Count == 2:
            case MethodCall.Max when node.Arguments.Count == 2:
            case MethodCall.Min when node.Arguments.Count == 2:
            case MethodCall.Average when node.Arguments.Count == 2:

                writer.Write(node.Method.Name == MethodCall.Average ? "AVG" : node.Method.Name.ToUpper());

                writer.OpenBrace();
                writer.Write("CASE WHEN ");

                Visit(node.Arguments[0]);

                writer.Write(" THEN ");

                Visit(node.Arguments[1]);

                writer.Write(" ELSE ");

                var returnType = node.Method.ReturnType;

                if (!returnType.IsValueType || returnType.IsNullable())
                {
                    writer.Null();
                }
                else if (returnType == Types.DateTime)
                {
                    writer.Parameter("date_utc_base", UtcBase);
                }
                else if (returnType == Types.DateTimeOffset)
                {
                    writer.Parameter("date_offset_utc_base", new DateTimeOffset(UtcBase));
                }
                else
                {
                    writer.Parameter($"{returnType.Name.ToUrlCase()}_default", Emptyable.Empty(node.Method.ReturnType));
                }

                writer.Write(" END");

                writer.CloseBrace();

                break;

            case MethodCall.Any when node.Arguments.Count == 1 && node.Arguments[0].NodeType == ExpressionType.Parameter:
                writer.BooleanTrue();
                break;

            case MethodCall.Any when node.Arguments.Count == 1:
                writer.Write("CASE ");

                writer.Write("MAX");

                writer.OpenBrace();
                writer.Write("CASE WHEN ");

                Visit(node.Arguments[0]);

                writer.Write(" THEN 1 ELSE 0 END");

                writer.CloseBrace();

                writer.Write(" WHEN 1 THEN ");

                writer.BooleanTrue();

                writer.Write(" ELSE ");

                writer.BooleanFalse();

                writer.Write(" END");
                break;

            case MethodCall.Any when node.Arguments.Count == 2:
            case MethodCall.All when node.Arguments.Count == 2:

                writer.Write("CASE ");

                writer.Write(node.Method.Name == MethodCall.Any ? "MAX" : "MIN");

                writer.OpenBrace();
                writer.Write("CASE WHEN ");

                VisitCondition(node);

                writer.Write(" THEN 1 ELSE 0 END");

                writer.CloseBrace();

                writer.Write(" WHEN 1 THEN ");

                writer.BooleanTrue();

                writer.Write(" ELSE ");

                writer.BooleanFalse();

                writer.Write(" END");

                break;

            case MethodCall.Sum:
            case MethodCall.Max:
            case MethodCall.Min:
            case MethodCall.Average:
                throw new DSyntaxErrorException($"分组中函数“{node.Method.Name}”需指定计算属性!");

            default:
                throw new DSyntaxErrorException($"分组中函数“{node.Method.Name}”不被支持!");
            }
        }