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> >(); }
/// <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}”不被支持!"); } }