diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/ExecuteNavProvider/DeleteNavManyToMany.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/ExecuteNavProvider/DeleteNavManyToMany.cs index 96b86ff56..23358c0b9 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/ExecuteNavProvider/DeleteNavManyToMany.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/ExecuteNavProvider/DeleteNavManyToMany.cs @@ -39,7 +39,7 @@ namespace SqlSugar .Rows.Cast().Select(it => it[0]).ToList(); - var childList = this._Context.Queryable().In(thisPkColumn.DbColumnName, bids).ToList(); + var childList = GetChildList().In(thisPkColumn.DbColumnName, bids).ToList(); if (IsDeleteB()) diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/ExecuteNavProvider/DeleteNavOneToMany.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/ExecuteNavProvider/DeleteNavOneToMany.cs index d1b33208d..45a37af84 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/ExecuteNavProvider/DeleteNavOneToMany.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/ExecuteNavProvider/DeleteNavOneToMany.cs @@ -28,8 +28,8 @@ namespace SqlSugar SetContext(() => this._Context.Deleteable(prentList).ExecuteCommand()); var ids = _ParentList.Select(it => parentPkColumn.PropertyInfo.GetValue(it)).ToList(); - var childList = this._Context.Queryable().In(thisFkColumn.DbColumnName, ids).ToList(); - + var childList = GetChildList().In(thisFkColumn.DbColumnName, ids).ToList(); + this._ParentList = childList.Cast().ToList(); this._ParentPkColumn = thisPkColumn; this._IsDeletedParant = true; @@ -37,6 +37,20 @@ namespace SqlSugar SetContext(() => this._Context.Deleteable(childList).ExecuteCommand()); } + private ISugarQueryable GetChildList() where TChild : class, new() + { + var queryable = this._Context.Queryable(); + if (_WhereList.HasValue()) + { + foreach (var item in _WhereList) + { + queryable.Where(item); + } + queryable.AddParameters(_Parameters); + } + return queryable; + } + private void SetContext(Action action) { var key = "_DeleteNavTask"; diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/ExecuteNavProvider/DeleteNavProvider.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/ExecuteNavProvider/DeleteNavProvider.cs index d7edca7f0..ac88473fc 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/ExecuteNavProvider/DeleteNavProvider.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/ExecuteNavProvider/DeleteNavProvider.cs @@ -17,11 +17,13 @@ namespace SqlSugar public EntityColumnInfo _ParentPkColumn { get; set; } public SqlSugarProvider _Context { get; set; } public bool _IsDeletedParant { get; set; } - + public List _WhereList = new List(); + public List _Parameters = new List(); public DeleteNavProvider ThenInclude< TChild>(Expression> expression) where TChild : class, new() { InitParentList(); + Expression newExp = GetMamber(expression); var name = ExpressionTool.GetMemberName(expression); var nav = this._ParentEntity.Columns.FirstOrDefault(x => x.PropertyName == name); if (nav.Navigat == null) @@ -47,7 +49,8 @@ namespace SqlSugar where TChild : class, new() { InitParentList(); - var name = ExpressionTool.GetMemberName(expression); + Expression newExp = GetMamber(expression); + var name = ExpressionTool.GetMemberName(newExp); var nav = this._ParentEntity.Columns.FirstOrDefault(x => x.PropertyName == name); if (nav.Navigat == null) { @@ -67,6 +70,61 @@ namespace SqlSugar } return GetResult(); } + + private Expression GetMamber(Expression expression) + { + int i = 0; + Expression newExp =ExpressionTool.GetLambdaExpressionBody(expression); + while (newExp is MethodCallExpression) + { + var callMethod = (newExp as MethodCallExpression); + ActionMethodCallExpression(callMethod); + newExp = callMethod.Arguments[0]; + i++; + Check.Exception(i > 10000, expression + " is error"); + } + return newExp; + } + + + private void ActionMethodCallExpression(MethodCallExpression method) + { + var queryBuilder = GetQueryBuilder(); + NavigatManager navigatManager = new NavigatManager() + { + Context = this._Context + }; + if (method.Method.Name == "ToList") + { + + } + else if (method.Method.Name == "Where") + { + navigatManager.CheckHasRootShortName(method.Arguments[0], method.Arguments[1]); + var exp = method.Arguments[1]; + _WhereList.Add(" " + queryBuilder.GetExpressionValue(exp, ResolveExpressType.WhereSingle).GetString()); + } + else if (method.Method.Name == "WhereIF") + { + var isOk = LambdaExpression.Lambda(method.Arguments[1]).Compile().DynamicInvoke(); + if (isOk.ObjToBool()) + { + var exp = method.Arguments[2]; + navigatManager.CheckHasRootShortName(method.Arguments[1], method.Arguments[2]); + _WhereList.Add(" " + queryBuilder.GetExpressionValue(exp, ResolveExpressType.WhereSingle).GetString()); + } + } + if (queryBuilder.Parameters != null) + { + _Parameters.AddRange(queryBuilder.Parameters); + } + } + + private QueryBuilder GetQueryBuilder() + { + return this._Context.Queryable().QueryBuilder; + } + private DeleteNavProvider GetResult() where TChild : class, new() { return new DeleteNavProvider() diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/NavigatManager.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/NavigatManager.cs index e74d9fdb5..cd02ab523 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/NavigatManager.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/NavigatManager.cs @@ -222,7 +222,7 @@ namespace SqlSugar CSharpTypeName = bColumn.PropertyInfo.PropertyType.Name })); var sql = GetWhereSql(); - var bList = selector(this.Context.Queryable().AS(bEntityInfo.DbTableName).AddParameters(sql.Parameters).Where(conditionalModels2).WhereIF(sql.WhereString.HasValue(),sql.WhereString).Select(sql.SelectString).OrderByIF(sql.OrderByString.HasValue(),sql.OrderByString)); + var bList = selector(this.Context.Queryable().AS(bEntityInfo.DbTableName).Filter(bEntityInfo.Type).AddParameters(sql.Parameters).Where(conditionalModels2).WhereIF(sql.WhereString.HasValue(),sql.WhereString).Select(sql.SelectString).OrderByIF(sql.OrderByString.HasValue(),sql.OrderByString)); if (bList.HasValue()) { foreach (var listItem in list) @@ -371,7 +371,7 @@ namespace SqlSugar if (list.Any() && navObjectNamePropety.GetValue(list.First()) == null) { - var navList = selector(this.Context.Queryable().AS(navEntityInfo.DbTableName).AddParameters(sqlObj.Parameters).Where(conditionalModels).WhereIF(sqlObj.WhereString.HasValue(), sqlObj.WhereString).Select(sqlObj.SelectString).OrderByIF(sqlObj.OrderByString.HasValue(), sqlObj.OrderByString)); + var navList = selector(this.Context.Queryable().AS(navEntityInfo.DbTableName).Filter(navEntityInfo.Type).AddParameters(sqlObj.Parameters).Where(conditionalModels).WhereIF(sqlObj.WhereString.HasValue(), sqlObj.WhereString).Select(sqlObj.SelectString).OrderByIF(sqlObj.OrderByString.HasValue(), sqlObj.OrderByString)); if (navList.HasValue()) { //var setValue = navList @@ -649,7 +649,7 @@ namespace SqlSugar result.SelectString = result.SelectString + "," + selectPkName; } } - private void CheckHasRootShortName(Expression rootExpression, Expression childExpression) + public void CheckHasRootShortName(Expression rootExpression, Expression childExpression) { var rootShortName = GetShortName(rootExpression); if (rootShortName.HasValue()&& childExpression.ToString().Contains($" {rootShortName}.")) diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs index 87926d15d..853944f2e 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs @@ -193,7 +193,15 @@ namespace SqlSugar _Filter(FilterName, isDisabledGobalFilter); return this; } - + public ISugarQueryable Filter(Type type) + { + var whereString= QueryBuilder.GetFilters(type); + if (whereString.HasValue()) + { + this.Where(whereString); + } + return this; + } public virtual ISugarQueryable Mapper(Action mapperAction) { this.MapperAction=UtilMethods.IsNullReturnNew(this.MapperAction); diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs index da5deae71..546479c7d 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs @@ -273,6 +273,38 @@ namespace SqlSugar } return result; } + + internal string GetFilters(Type type) + { + var result = ""; + if (this.Context != null) + { + var db = Context; + BindingFlags flag = BindingFlags.Instance | BindingFlags.NonPublic; + var index = 0; + if (db.QueryFilter.GeFilterList != null) + { + foreach (var item in db.QueryFilter.GeFilterList) + { + PropertyInfo field = item.GetType().GetProperty("exp", flag); + if (field != null) + { + Type ChildType = item.GetType().GetProperty("type", flag).GetValue(item, null) as Type; + if (ChildType == type) + { + var entityInfo = db.EntityMaintenance.GetEntityInfo(ChildType); + var exp = field.GetValue(item, null) as Expression; + var whereStr = index==0 ? " " : " AND "; + index++; + result += (whereStr + GetExpressionValue(exp, ResolveExpressType.WhereSingle).GetString()); + } + } + } + } + } + return result; + } + public virtual string ToSqlString() { string oldOrderBy = this.OrderByValue; diff --git a/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs b/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs index fc59a7782..8d24ab674 100644 --- a/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs +++ b/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs @@ -91,6 +91,19 @@ namespace SqlSugar else return value; } + + public static Expression GetLambdaExpressionBody(Expression expression) + { + Expression newExp = expression; + if (newExp is LambdaExpression) + { + newExp = (newExp as LambdaExpression).Body; + } + + return newExp; + } + + public static Type GetMemberInfoType(MemberInfo member) { switch (member.MemberType) diff --git a/Src/Asp.NetCore2/SqlSugar/Interface/IQueryable.cs b/Src/Asp.NetCore2/SqlSugar/Interface/IQueryable.cs index 2acdbc538..ccea0e449 100644 --- a/Src/Asp.NetCore2/SqlSugar/Interface/IQueryable.cs +++ b/Src/Asp.NetCore2/SqlSugar/Interface/IQueryable.cs @@ -27,6 +27,7 @@ namespace SqlSugar ISugarQueryable InnerJoin(Expression> joinExpression); ISugarQueryable RightJoin(Expression> joinExpression); ISugarQueryable Filter(string FilterName, bool isDisabledGobalFilter = false); + ISugarQueryable Filter(Type type); ISugarQueryable Mapper(Action mapperAction); ISugarQueryable Mapper(Expression> expression); ISugarQueryable Mapper(Action> mapperAction);