diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml
index 474ea8d5..4854f49c 100644
--- a/FreeSql.DbContext/FreeSql.DbContext.xml
+++ b/FreeSql.DbContext/FreeSql.DbContext.xml
@@ -486,5 +486,14 @@
+
+
+ 批量注入 Repository,可以参考代码自行调整
+
+
+
+
+
+
diff --git a/FreeSql.Tests/FreeSql.Tests/UnitTest2.cs b/FreeSql.Tests/FreeSql.Tests/UnitTest2.cs
index 8acbdf71..7f0d97fc 100644
--- a/FreeSql.Tests/FreeSql.Tests/UnitTest2.cs
+++ b/FreeSql.Tests/FreeSql.Tests/UnitTest2.cs
@@ -279,7 +279,7 @@ namespace FreeSql.Tests
kwrepo.Insert(u1);
- g.sqlite.GlobalFilter.Apply("gft1", a => a.rowstate > -1)
+ g.sqlite.GlobalFilter.Apply("gft1", a => a.rowstate > -1 && g.sqlite.Select().Any(b => b.id == a.id))
.Apply("gft2", a => a.rowstate > -2)
.Apply("gft3", a => a.rowstate > -3);
diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs
index b3dd4523..8bb2196e 100644
--- a/FreeSql/Internal/CommonExpression.cs
+++ b/FreeSql/Internal/CommonExpression.cs
@@ -1438,7 +1438,8 @@ namespace FreeSql.Internal
{
if (_whereCascadeExpression.Any())
{
- var newParameter = Expression.Parameter(tb.Table.Type, "c");
+ var newParameter = Expression.Parameter(tb.Table.Type, tb.Alias);
+ tb.Parameter = newParameter;
var sb = new StringBuilder();
var isEmpty = true;
@@ -1452,10 +1453,10 @@ namespace FreeSql.Internal
{
var expExp = Expression.Lambda(
typeof(Func<,>).MakeGenericType(tb.Table.Type, typeof(bool)),
- new ReplaceVisitor().Modify(fl.Body, newParameter),
+ new ReplaceVisitor().Modify(fl, newParameter),
newParameter
);
- var whereSql = ExpressionLambdaToSql(expExp.Body, new ExpTSC { _tables = null, _selectColumnMap = null, getSelectGroupingMapString = null, tbtype = SelectTableInfoType.From, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where, currentTable = tb.Table, alias001 = tb.Alias });
+ var whereSql = ExpressionLambdaToSql(expExp.Body, new ExpTSC { _tables = new List(new[] { tb }), _selectColumnMap = null, getSelectGroupingMapString = null, tbtype = SelectTableInfoType.From, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where, currentTable = tb.Table, alias001 = tb.Alias });
whereSql = GetBoolString(expExp.Body, whereSql);
if (isEmpty == false)
sb.Append(" AND ");
@@ -1478,14 +1479,16 @@ namespace FreeSql.Internal
internal class ReplaceVisitor : ExpressionVisitor
{
private ParameterExpression parameter;
- public Expression Modify(Expression expression, ParameterExpression parameter)
+ private ParameterExpression oldParameter;
+ public Expression Modify(LambdaExpression lambda, ParameterExpression parameter)
{
this.parameter = parameter;
- return Visit(expression);
+ this.oldParameter = lambda.Parameters.FirstOrDefault();
+ return Visit(lambda.Body);
}
protected override Expression VisitMember(MemberExpression node)
{
- if (node.Expression?.NodeType == ExpressionType.Parameter)
+ if (node.Expression?.NodeType == ExpressionType.Parameter && node.Expression == oldParameter)
return Expression.Property(parameter, node.Member.Name);
return base.VisitMember(node);
}
diff --git a/FreeSql/Internal/GlobalFilter.cs b/FreeSql/Internal/GlobalFilter.cs
index 01992c9f..f0250d8b 100644
--- a/FreeSql/Internal/GlobalFilter.cs
+++ b/FreeSql/Internal/GlobalFilter.cs
@@ -35,7 +35,7 @@ namespace FreeSql.Internal
var newParameter = Expression.Parameter(typeof(TEntity), $"gf{_id}");
var newlambda = Expression.Lambda>(
- new CommonExpression.ReplaceVisitor().Modify(where.Body, newParameter),
+ new CommonExpression.ReplaceVisitor().Modify(where, newParameter),
newParameter
);
item.Where = newlambda;