diff --git a/Src/Asp.Net/SqlServerTest/UnitTest/UCustom012.cs b/Src/Asp.Net/SqlServerTest/UnitTest/UCustom012.cs index 42fa27102..6701305b5 100644 --- a/Src/Asp.Net/SqlServerTest/UnitTest/UCustom012.cs +++ b/Src/Asp.Net/SqlServerTest/UnitTest/UCustom012.cs @@ -55,7 +55,7 @@ namespace OrmTest var list2 = db.Queryable() .Includes(x => x.SchoolA, x => x.RoomList)//2个参数就是 then Include .Includes(x => x.Books) - .Where(x=>x.Books.Any()) + .Where(x=>x.Books.Any(z=>z.BookId==1)) .Where(x => x.SchoolA.SchoolName == "北大") .ToList(); diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/BaseResolve.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/BaseResolve.cs index 8124e19c1..bd951710a 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/BaseResolve.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/BaseResolve.cs @@ -319,7 +319,7 @@ namespace SqlSugar return methodCallExpressionArgs; } - protected string GetNewExpressionValue(Expression item) + public string GetNewExpressionValue(Expression item) { var newContext = this.Context.GetCopyContextWithMapping(); newContext.Resolve(item, this.Context.IsJoin ? ResolveExpressType.WhereMultiple : ResolveExpressType.WhereSingle); diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs index b8a760a03..65b339222 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs @@ -244,7 +244,7 @@ namespace SqlSugar { try { - OneToManyNavgateExpression nav=new OneToManyNavgateExpression(this.Context?.SugarContext?.Context); + OneToManyNavgateExpression nav=new OneToManyNavgateExpression(this.Context?.SugarContext?.Context,this); if (nav.IsNavgate(express)) { var sql = nav.GetSql(); diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/NavgateExpressionCall.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/NavgateExpressionCall.cs index 94801c262..dfbe9c1bd 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/NavgateExpressionCall.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/NavgateExpressionCall.cs @@ -16,9 +16,12 @@ namespace SqlSugar public string ShorName; private string MemberName; private string MethodName; - public OneToManyNavgateExpression(SqlSugarProvider context) + private string whereSql; + private MethodCallExpressionResolve methodCallExpressionResolve; + public OneToManyNavgateExpression(SqlSugarProvider context, MethodCallExpressionResolve methodCallExpressionResolve) { this.context = context; + this.methodCallExpressionResolve = methodCallExpressionResolve; } internal bool IsNavgate(Expression expression) @@ -36,11 +39,22 @@ namespace SqlSugar if (memberExp.Method.Name.IsIn("Any","Count") && memberExp.Arguments.Count>0 && memberExp.Arguments[0] is MemberExpression ) { result = ValidateNav(result, memberExp.Arguments[0] as MemberExpression, memberExp.Arguments[0]); + if (memberExp.Arguments.Count > 1) + { + whereSql = GetWhereSql(memberExp); + } } } return result; } + private string GetWhereSql(MethodCallExpression memberExp) + { + var whereExp = memberExp.Arguments[1]; + var result= this.methodCallExpressionResolve.GetNewExpressionValue(whereExp); + return result; + } + private bool ValidateNav(bool result, MemberExpression memberExp, Expression childExpression) { if (childExpression != null && childExpression is MemberExpression) @@ -90,6 +104,7 @@ namespace SqlSugar selectName = queryable.QueryBuilder.Builder.GetTranslationColumnName(selectName); mapper.Sql = queryable .AS(this.ProPertyEntity.DbTableName) + .WhereIF(!string.IsNullOrEmpty(whereSql),whereSql) .Where($" {ShorName}.{name}={pk} ").Select(selectName).ToSql().Key; mapper.Sql = $" ({mapper.Sql}) "; mapper.Sql = GetMethodSql(mapper.Sql); @@ -107,6 +122,7 @@ namespace SqlSugar //selectName = queryable.QueryBuilder.Builder.GetTranslationColumnName(selectName); mapper.Sql = queryable .AS(this.ProPertyEntity.DbTableName) + .WhereIF(!string.IsNullOrEmpty(whereSql), whereSql) .Where($" {name}={ShorName}.{pk} ").Select(" COUNT(1) ").ToSql().Key; mapper.Sql = $" ({mapper.Sql}) "; mapper.Sql = GetMethodSql(mapper.Sql);