修复表达式解析bug,发布x.3.2.10

This commit is contained in:
xuejiaming 2022-01-02 02:27:54 +08:00
parent 07fd59f288
commit 819b4711af
2 changed files with 49 additions and 27 deletions

View File

@ -1,9 +1,9 @@
:start :start
::定义版本 ::定义版本
set EFCORE2=2.3.2.09 set EFCORE2=2.3.2.10
set EFCORE3=3.3.2.09 set EFCORE3=3.3.2.10
set EFCORE5=5.3.2.09 set EFCORE5=5.3.2.10
set EFCORE6=6.3.2.09 set EFCORE6=6.3.2.10
::删除所有bin与obj下的文件 ::删除所有bin与obj下的文件
@echo off @echo off

View File

@ -34,8 +34,7 @@ namespace ShardingCore.Core.Internal.Visitors
/// </summary> /// </summary>
private readonly bool _shardingTableRoute; private readonly bool _shardingTableRoute;
private Expression<Func<string, bool>> _where = x => true; private Expression<Func<string, bool>> _where = x => true;
private bool useQueryFilterOnFirstWhere = false; private LambdaExpression _entityLambdaExpression;
private readonly ShardingPredicateResult _noShardingPredicateResult = new ShardingPredicateResult(false, null); private readonly ShardingPredicateResult _noShardingPredicateResult = new ShardingPredicateResult(false, null);
public QueryableRouteShardingTableDiscoverVisitor(EntityMetadata entityMetadata, Func<object, ShardingOperatorEnum, string, Expression<Func<string, bool>>> keyToTailWithFilter, bool shardingTableRoute) public QueryableRouteShardingTableDiscoverVisitor(EntityMetadata entityMetadata, Func<object, ShardingOperatorEnum, string, Expression<Func<string, bool>>> keyToTailWithFilter, bool shardingTableRoute)
@ -47,14 +46,24 @@ namespace ShardingCore.Core.Internal.Visitors
public Expression<Func<string, bool>> GetRouteParseExpression() public Expression<Func<string, bool>> GetRouteParseExpression()
{ {
if (!useQueryFilterOnFirstWhere)
if (_entityMetadata.QueryFilterExpression != null)
{ {
useQueryFilterOnFirstWhere = true; if (_entityLambdaExpression == null)
if (_entityMetadata.QueryFilterExpression != null)
{ {
var newWhere= Resolve(_entityMetadata.QueryFilterExpression); _entityLambdaExpression = _entityMetadata.QueryFilterExpression;
_where = _where.And(newWhere);
} }
else
{
var body = Expression.AndAlso(_entityLambdaExpression.Body, _entityMetadata.QueryFilterExpression.Body);
_entityLambdaExpression = Expression.Lambda(body, _entityLambdaExpression.Parameters[0]);
}
}
if (_entityLambdaExpression != null)
{
var newWhere = Resolve(_entityLambdaExpression);
_where = _where.And(newWhere);
} }
return _where; return _where;
} }
@ -178,8 +187,21 @@ namespace ShardingCore.Core.Internal.Visitors
{ {
if (unaryExpression.Operand is LambdaExpression lambdaExpression) if (unaryExpression.Operand is LambdaExpression lambdaExpression)
{ {
var newWhere = DoResolve(lambdaExpression); if (lambdaExpression.Parameters[0].Type == _entityMetadata.EntityType)
_where = _where.And(newWhere); {
if (_entityLambdaExpression == null)
{
_entityLambdaExpression = lambdaExpression;
}
else
{
var body = Expression.AndAlso(_entityLambdaExpression.Body, lambdaExpression.Body);
var lambda = Expression.Lambda(body, _entityLambdaExpression.Parameters[0]);
_entityLambdaExpression = lambda;
}
}
//var newWhere = DoResolve(lambdaExpression);
//_where = _where.And(newWhere);
} }
} }
} }
@ -187,21 +209,21 @@ namespace ShardingCore.Core.Internal.Visitors
return base.VisitMethodCall(node); return base.VisitMethodCall(node);
} }
private Expression<Func<string, bool>> DoResolve(LambdaExpression lambdaExpression) //private Expression<Func<string, bool>> DoResolve(LambdaExpression lambdaExpression)
{ //{
if (!useQueryFilterOnFirstWhere) // if (!useQueryFilterOnFirstWhere)
{ // {
useQueryFilterOnFirstWhere = true; // useQueryFilterOnFirstWhere = true;
if (_entityMetadata.QueryFilterExpression != null) // if (_entityMetadata.QueryFilterExpression != null)
{ // {
var body = Expression.AndAlso(lambdaExpression.Body, _entityMetadata.QueryFilterExpression.Body); // var body = Expression.AndAlso(lambdaExpression.Body, _entityMetadata.QueryFilterExpression.Body);
var lambda = Expression.Lambda(body, lambdaExpression.Parameters[0]); // var lambda = Expression.Lambda(body, lambdaExpression.Parameters[0]);
return Resolve(lambda); // return Resolve(lambda);
} // }
} // }
return Resolve(lambdaExpression); // return Resolve(lambdaExpression);
} //}
private Expression<Func<string, bool>> Resolve(Expression expression) private Expression<Func<string, bool>> Resolve(Expression expression)