- 增加 WhereCascade/GlobalFilter 表达式子查询的支持;

This commit is contained in:
28810 2020-05-02 11:17:59 +08:00
parent d24969d9b1
commit 1e83a7eeaa
4 changed files with 20 additions and 8 deletions

View File

@ -486,5 +486,14 @@
<param name="that"></param> <param name="that"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:Microsoft.Extensions.DependencyInjection.FreeSqlRepositoryDependencyInjection.AddFreeRepository(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Action{FreeSql.FluentDataFilter},System.Reflection.Assembly[])">
<summary>
批量注入 Repository可以参考代码自行调整
</summary>
<param name="services"></param>
<param name="globalDataFilter"></param>
<param name="assemblies"></param>
<returns></returns>
</member>
</members> </members>
</doc> </doc>

View File

@ -279,7 +279,7 @@ namespace FreeSql.Tests
kwrepo.Insert(u1); kwrepo.Insert(u1);
g.sqlite.GlobalFilter.Apply<gf_t1>("gft1", a => a.rowstate > -1) g.sqlite.GlobalFilter.Apply<gf_t1>("gft1", a => a.rowstate > -1 && g.sqlite.Select<gf_t2>().Any(b => b.id == a.id))
.Apply<gf_t2>("gft2", a => a.rowstate > -2) .Apply<gf_t2>("gft2", a => a.rowstate > -2)
.Apply<gf_t3>("gft3", a => a.rowstate > -3); .Apply<gf_t3>("gft3", a => a.rowstate > -3);

View File

@ -1438,7 +1438,8 @@ namespace FreeSql.Internal
{ {
if (_whereCascadeExpression.Any()) 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 sb = new StringBuilder();
var isEmpty = true; var isEmpty = true;
@ -1452,10 +1453,10 @@ namespace FreeSql.Internal
{ {
var expExp = Expression.Lambda( var expExp = Expression.Lambda(
typeof(Func<,>).MakeGenericType(tb.Table.Type, typeof(bool)), typeof(Func<,>).MakeGenericType(tb.Table.Type, typeof(bool)),
new ReplaceVisitor().Modify(fl.Body, newParameter), new ReplaceVisitor().Modify(fl, newParameter),
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<SelectTableInfo>(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); whereSql = GetBoolString(expExp.Body, whereSql);
if (isEmpty == false) if (isEmpty == false)
sb.Append(" AND "); sb.Append(" AND ");
@ -1478,14 +1479,16 @@ namespace FreeSql.Internal
internal class ReplaceVisitor : ExpressionVisitor internal class ReplaceVisitor : ExpressionVisitor
{ {
private ParameterExpression parameter; private ParameterExpression parameter;
public Expression Modify(Expression expression, ParameterExpression parameter) private ParameterExpression oldParameter;
public Expression Modify(LambdaExpression lambda, ParameterExpression parameter)
{ {
this.parameter = parameter; this.parameter = parameter;
return Visit(expression); this.oldParameter = lambda.Parameters.FirstOrDefault();
return Visit(lambda.Body);
} }
protected override Expression VisitMember(MemberExpression node) 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 Expression.Property(parameter, node.Member.Name);
return base.VisitMember(node); return base.VisitMember(node);
} }

View File

@ -35,7 +35,7 @@ namespace FreeSql.Internal
var newParameter = Expression.Parameter(typeof(TEntity), $"gf{_id}"); var newParameter = Expression.Parameter(typeof(TEntity), $"gf{_id}");
var newlambda = Expression.Lambda<Func<TEntity, bool>>( var newlambda = Expression.Lambda<Func<TEntity, bool>>(
new CommonExpression.ReplaceVisitor().Modify(where.Body, newParameter), new CommonExpression.ReplaceVisitor().Modify(where, newParameter),
newParameter newParameter
); );
item.Where = newlambda; item.Where = newlambda;