diff --git a/Src/Asp.Net/SqlServerTest/UnitTest/UCustom012.cs b/Src/Asp.Net/SqlServerTest/UnitTest/UCustom012.cs index 997929d74..10d5e4639 100644 --- a/Src/Asp.Net/SqlServerTest/UnitTest/UCustom012.cs +++ b/Src/Asp.Net/SqlServerTest/UnitTest/UCustom012.cs @@ -51,6 +51,13 @@ namespace OrmTest db.Insertable(new BookA() { BookId = 4, Name = "php", studenId = 3 }).ExecuteCommand(); db.Insertable(new BookA() { BookId = 5, Name = "js", studenId = 4 }).ExecuteCommand(); + + var list2 = db.Queryable() + .Includes(x => x.SchoolA, x => x.RoomList)//2个参数就是 then Include + .Includes(x => x.Books) + .Where(x => x.SchoolA.SchoolName == "北大") + .ToList(); + //先用Mapper导航映射查出第二层 var list = db.Queryable().Mapper(x => x.SchoolA, x => x.SchoolId).ToList(); @@ -65,10 +72,7 @@ namespace OrmTest }); - var list2=db.Queryable() - .Includes(x => x.SchoolA, x => x.RoomList)//2个参数就是 then Include - .Includes(x => x.Books) - .ToList(); + db.CodeFirst.InitTables(); db.DbMaintenance.TruncateTable(); db.DbMaintenance.TruncateTable(); diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MemberExpressionResolve.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MemberExpressionResolve.cs index ad95598fc..19748e87a 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MemberExpressionResolve.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/MemberExpressionResolve.cs @@ -58,7 +58,24 @@ namespace SqlSugar } else if (isMemberValue) { - ResolveMemberValue(parameter, baseParameter, isLeft, isSetTempData, expression); + var nav = new OneToOneNavgateExpression(this.Context?.SugarContext?.Context); + if (nav.IsNavgate(expression)) + { + var value = nav.GetSql(); + this.Context.SingleTableNameSubqueryShortName = nav.ShorName; + if (isSetTempData) + { + baseParameter.CommonTempData = value; + } + else + { + AppendValue(parameter, isLeft, value); + } + } + else + { + ResolveMemberValue(parameter, baseParameter, isLeft, isSetTempData, expression); + } } else if (fieldIsBool && !isField && !isSelectField) { diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/NavgateExpression.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/NavgateExpression.cs index a08f57907..6f5e4d357 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/NavgateExpression.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/NavgateExpression.cs @@ -7,11 +7,15 @@ using System.Threading.Tasks; namespace SqlSugar { - internal class NavgateExpression + internal class OneToOneNavgateExpression { private SqlSugarProvider context; - - public NavgateExpression(SqlSugarProvider context) + private EntityInfo EntityInfo; + private EntityInfo ProPertyEntity; + private Navigat Navigat; + public string ShorName; + private string MemberName; + public OneToOneNavgateExpression(SqlSugarProvider context) { this.context = context; } @@ -26,13 +30,44 @@ namespace SqlSugar if (exp is MemberExpression) { var memberExp=exp as MemberExpression; + var childExpression = memberExp.Expression; + if (childExpression != null && childExpression is MemberExpression) + { + var child2Expression = (childExpression as MemberExpression).Expression; + if (child2Expression.Type.IsClass()&& child2Expression is ParameterExpression) + { + var entity= this.context.EntityMaintenance.GetEntityInfo(child2Expression.Type); + if (entity.Columns.Any(x => x.PropertyName == (childExpression as MemberExpression).Member.Name && x.Navigat != null)) + { + EntityInfo = entity; + ShorName = child2Expression.ToString(); + MemberName= memberExp.Member.Name; + ProPertyEntity = this.context.EntityMaintenance.GetEntityInfo(childExpression.Type); + Navigat = entity.Columns.FirstOrDefault(x => x.PropertyName == (childExpression as MemberExpression).Member.Name).Navigat; + return true; + } + } + } } return false; } - internal void Execute(MapperExpressionResolve mapperExpressionResolve) + + internal MapperSql GetSql() { - + var pk = this.ProPertyEntity.Columns.First(it => it.IsPrimarykey == true).DbColumnName; + var name = this.EntityInfo.Columns.First(it => it.PropertyName == Navigat.Name).DbColumnName; + var selectName = this.ProPertyEntity.Columns.First(it => it.PropertyName ==MemberName).DbColumnName; + MapperSql mapper = new MapperSql(); + var queryable = this.context.Queryable(); + pk = queryable.QueryBuilder.Builder.GetTranslationColumnName(pk); + name = queryable.QueryBuilder.Builder.GetTranslationColumnName(name); + selectName = queryable.QueryBuilder.Builder.GetTranslationColumnName(selectName); + mapper.Sql = queryable + .AS(this.ProPertyEntity.DbTableName) + .Where($" {ShorName}.{name}={pk} ").Select(selectName).ToSql().Key; + mapper.Sql = $" ({mapper.Sql}) "; + return mapper; } } }