|
1 |
| -using System.Linq; |
2 |
| -using System.Linq.Expressions; |
| 1 | +using System.Linq.Expressions; |
3 | 2 | using System.Reflection;
|
4 | 3 |
|
5 | 4 | namespace DataCore
|
6 | 5 | {
|
7 | 6 | public class QueryVisitor : ExpressionVisitor
|
8 | 7 | {
|
9 |
| - public Parameters Parameters { get; } |
| 8 | + private readonly Parameters _parameters; |
10 | 9 |
|
11 | 10 | public QueryVisitor(Parameters parameters)
|
12 | 11 | {
|
13 |
| - Parameters = parameters; |
| 12 | + _parameters = parameters; |
14 | 13 | }
|
15 | 14 |
|
16 | 15 | protected override Expression VisitMember(MemberExpression memberExpression)
|
@@ -40,32 +39,36 @@ protected override Expression VisitMember(MemberExpression memberExpression)
|
40 | 39 |
|
41 | 40 | protected override Expression VisitNew(NewExpression node)
|
42 | 41 | {
|
43 |
| - var args = node.Arguments.Select(a => ((ConstantExpression)a).Value).ToArray(); |
44 |
| - |
| 42 | + var args = new object[node.Arguments.Count]; |
| 43 | + for (var i = 0; i < args.Length; i++) |
| 44 | + { |
| 45 | + args[i] = ((ConstantExpression)node.Arguments[i]).Value; |
| 46 | + } |
| 47 | + |
45 | 48 | var newObject = node.Constructor.Invoke(args);
|
46 | 49 |
|
47 | 50 | return Expression.Constant(newObject);
|
48 | 51 | }
|
49 | 52 |
|
50 | 53 | protected override Expression VisitMethodCall(MethodCallExpression node)
|
51 | 54 | {
|
52 |
| - if (ExpressionHelper.GetSqlExtensionMethodCallConstant(new Translator(), node, Parameters, out _)) |
| 55 | + if (ExpressionHelper.GetSqlExtensionMethodCallConstant(new Translator(), node, _parameters, out _)) |
53 | 56 | return node;
|
54 | 57 |
|
55 | 58 | var obj = ((ConstantExpression) node.Object)?.Value;
|
56 |
| - var args = node.Arguments.Select( |
57 |
| - a => |
58 |
| - { |
59 |
| - ConstantExpression constExpr; |
| 59 | + |
| 60 | + var args = new object[node.Arguments.Count]; |
| 61 | + for (var i = 0; i < args.Length; i++) |
| 62 | + { |
| 63 | + ConstantExpression constExpr; |
60 | 64 |
|
61 |
| - if (a is MemberExpression memberExpr) |
62 |
| - constExpr = VisitMember(memberExpr) as ConstantExpression; |
63 |
| - else |
64 |
| - constExpr = a as ConstantExpression; |
| 65 | + if (node.Arguments[i] is MemberExpression memberExpr) |
| 66 | + constExpr = VisitMember(memberExpr) as ConstantExpression; |
| 67 | + else |
| 68 | + constExpr = node.Arguments[i] as ConstantExpression; |
65 | 69 |
|
66 |
| - return constExpr?.Value; |
67 |
| - } |
68 |
| - ).ToArray(); |
| 70 | + args[i] = constExpr?.Value; |
| 71 | + } |
69 | 72 |
|
70 | 73 | var newObject = node.Method.Invoke(obj, args);
|
71 | 74 |
|
|
0 commit comments