From 1e83a7eeaad281dfc6a74363504ce4b3b91366a0 Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Sat, 2 May 2020 11:17:59 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E5=A2=9E=E5=8A=A0=20WhereCascade/GlobalFil?= =?UTF-8?q?ter=20=E8=A1=A8=E8=BE=BE=E5=BC=8F=E5=AD=90=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E7=9A=84=E6=94=AF=E6=8C=81=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.DbContext/FreeSql.DbContext.xml | 9 +++++++++ FreeSql.Tests/FreeSql.Tests/UnitTest2.cs | 2 +- FreeSql/Internal/CommonExpression.cs | 15 +++++++++------ FreeSql/Internal/GlobalFilter.cs | 2 +- 4 files changed, 20 insertions(+), 8 deletions(-) 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;