Skip to content

Commit 3f44744

Browse files
committed
[#172] bug修复
1 parent 703bf84 commit 3f44744

File tree

3 files changed

+26
-5
lines changed

3 files changed

+26
-5
lines changed

src/ShardingCore/Sharding/Visitors/QueryableRouteDiscoverVisitorV2.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,8 @@ member.Expression is MemberExpression ||
162162
member.Expression is MemberExpression))
163163
|| expression is MethodCallExpression
164164
|| (expression is UnaryExpression unaryExpression &&
165-
unaryExpression.NodeType is ExpressionType.Convert);
165+
unaryExpression.NodeType is ExpressionType.Convert)
166+
|| expression.NodeType == ExpressionType.ArrayIndex;
166167
}
167168

168169
private bool IsMethodCall(Expression expression)
@@ -460,13 +461,15 @@ private RoutePredicateExpression ParseCondition0(Expression left, Expression rig
460461
return RoutePredicateExpression.Default;
461462
}
462463

463-
private RoutePredicateExpression ParseNamedComparison(BinaryExpression binaryExpression,MethodCallExpression methodCallExpression)
464+
private RoutePredicateExpression ParseNamedComparison(BinaryExpression binaryExpression,
465+
MethodCallExpression methodCallExpression)
464466
{
465467
if (methodCallExpression.GetComparisonLeftAndRight(out var result))
466468
{
467469
return ParseCompare(methodCallExpression, result.Left, result.Right,
468470
binaryExpression.NodeType, (int)GetExpressionValue(binaryExpression.Right));
469471
}
472+
470473
return RoutePredicateExpression.Default;
471474
}
472475

@@ -557,7 +560,8 @@ private RoutePredicateExpression ParsePropertyCondition(BinaryExpression binaryE
557560
{
558561
return ParseConditionOnRight0(false, predicateRightResult, binaryExpression.Left,
559562
binaryExpression.NodeType);
560-
} else if (binaryExpression.IsNamedComparison(out var methodCallExpression))
563+
}
564+
else if (binaryExpression.IsNamedComparison(out var methodCallExpression))
561565
{
562566
return ParseNamedComparison(binaryExpression, methodCallExpression);
563567
}
@@ -589,7 +593,7 @@ private RoutePredicateExpression ParsePropertyCondition(BinaryExpression binaryE
589593
}
590594

591595
if (binaryExpression.Left is UnaryExpression unaryExpression1 &&
592-
(binaryExpression.Right is MemberExpression ))
596+
(binaryExpression.Right is MemberExpression))
593597
left = Resolve(unaryExpression1);
594598
if (binaryExpression.Right is UnaryExpression unaryExpression2 &&
595599
(binaryExpression.Left is MemberExpression))

src/ShardingCore/Sharding/Visitors/ShardingExpressionVisitor.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Collections;
23
using System.Collections.Generic;
34
using System.Linq;
45
using System.Linq.Expressions;
@@ -114,8 +115,22 @@ protected object GetExpressionValue(Expression expression)
114115
}
115116

116117
default:
118+
{
119+
if (expression is BinaryExpression binaryExpression&&expression.NodeType == ExpressionType.ArrayIndex)
120+
{
121+
var index = GetExpressionValue(binaryExpression.Right);
122+
if (index is int i)
123+
{
124+
var arrayObject = GetExpressionValue(binaryExpression.Left);
125+
if (arrayObject is IList list)
126+
{
127+
return list[i];
128+
}
129+
}
130+
}
117131
//TODO: better messaging
118132
throw new ShardingCoreException("cant get value " + expression);
133+
}
119134
}
120135
}
121136
}

test/ShardingCore.CommonTest/ShardingTableTime.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,13 @@ public void TestSingleTable()
9191
var id = "1";
9292
var times = new []{queryTime};
9393
var times1 = new List<DateTime>(){queryTime};
94+
var times2 = new []{queryTime,queryTime2};
9495
var obj1 = new {time=new DateTime(2022, 1, 2)};
9596
var queryables=new List<IQueryable<TestTimeEntity>>()
9697
{
9798

98-
// new List<TestTimeEntity>().AsQueryable().Where(o=>o.Time==times[0]),
99+
new List<TestTimeEntity>().AsQueryable().Where(o=>o.Time==times2[0]),
100+
new List<TestTimeEntity>().AsQueryable().Where(o=>o.Time>=times2[0]&&o.Time<times2[1]),
99101
new List<TestTimeEntity>().AsQueryable().Where(o=>o.Time>=queryTime&&o.Time<queryTime2),
100102
new List<TestTimeEntity>().AsQueryable().Where(o=>o.Time==queryTime),
101103
new List<TestTimeEntity>().AsQueryable().Where(o=>o.Time>=queryTime&&o.Time<queryTime2),

0 commit comments

Comments
 (0)