mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-04-22 10:42:52 +08:00
- 增加 WhereCascade/GlobalFilter 表达式子查询的支持;
This commit is contained in:
parent
d24969d9b1
commit
1e83a7eeaa
@ -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>
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user