diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/Entities/AppendNavInfoList.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/Entities/AppendNavInfoList.cs index f190ff324..545b91e5c 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/Entities/AppendNavInfoList.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/Entities/AppendNavInfoList.cs @@ -19,5 +19,6 @@ namespace SqlSugar { public List ExpressionList { get; set; } public string Name { get; set; } + public string ParentName { get; set; } } } diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableHelper.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableHelper.cs index 4175d88aa..158ae2b9b 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableHelper.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableHelper.cs @@ -13,6 +13,7 @@ using System.Collections.ObjectModel; using NetTaste; using Newtonsoft.Json.Linq; using System.Xml.Linq; +using System.Runtime.CompilerServices; namespace SqlSugar @@ -597,7 +598,7 @@ namespace SqlSugar AddMappingNavProperties(dic, navInfo, entityColumns); } - private static void AddMappingNavProperties(Dictionary dic, AppendNavInfo navInfo, List entityColumns) + private void AddMappingNavProperties(Dictionary dic, AppendNavInfo navInfo, List entityColumns) { foreach (var item in dic) { @@ -617,6 +618,22 @@ namespace SqlSugar }; navInfo.MappingNavProperties.Add(item.Key, mappingNavColumnInfo); } + else if (ExpressionTool.IsNavMember(this.Context,value)) + { + var mappingNavColumnInfo = new MappingNavColumnInfo() + { + ExpressionList = expressionTree, + Name = name + }; + if (value is MemberExpression exp) + { + if (exp.Expression is MemberExpression expChild) + { + mappingNavColumnInfo.ParentName = expChild.Member.Name; + } + } + navInfo.MappingNavProperties.Add(item.Key, mappingNavColumnInfo); + } } } @@ -746,8 +763,17 @@ namespace SqlSugar { var rightName = item.Value.Name; var rightColumnInfo = columnInfos.FirstOrDefault(a => a.PropertyName == rightName); + var anyParent = item.Value.ParentName.HasValue(); + if (anyParent) + { + rightColumnInfo = columnInfos.FirstOrDefault(a => a.PropertyName == item.Value.ParentName); + } var rightValue=rightColumnInfo.PropertyInfo.GetValue(rightObject); var leftName = item.Key; + if (anyParent) + { + rightValue = rightValue.GetType().GetProperty(item.Value.Name).GetValue(rightValue); + } //// var rightColumn=col // object value = item; if (item.Value.ExpressionList.Count > 1 && rightValue != null) diff --git a/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs b/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs index 2d9a555be..f23096c0a 100644 --- a/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs +++ b/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs @@ -101,6 +101,35 @@ namespace SqlSugar } return isNav; } + internal static bool IsNavMember(ISqlSugarClient context, Expression member) + { + var isNav = false; + if (member is MemberExpression && (member as MemberExpression)?.Type?.IsClass() == true) + { + var memberExp = (member as MemberExpression); + var name = memberExp?.Member?.Name; + var type = memberExp?.Type; + if (name != null && type != null && memberExp.Expression is ParameterExpression) + { + var rootExp = (memberExp.Expression as ParameterExpression); + var entityInfo = context?.EntityMaintenance?.GetEntityInfo(rootExp.Type); + var navColumn = entityInfo.Columns.FirstOrDefault(it => it.PropertyName == name); + isNav = navColumn?.Navigat != null; + } + else if (name != null && type != null && memberExp.Expression is MemberExpression) + { + var rootExp = (memberExp.Expression as MemberExpression); + if (rootExp.Type.IsClass()&&type.IsArray==false&&type.FullName.IsCollectionsList()==false) + { + var entityInfo = context?.EntityMaintenance?.GetEntityInfo(rootExp.Type); + var navColumn = entityInfo.Columns.FirstOrDefault(it => it.PropertyName == name); + isNav = navColumn?.Navigat != null; + } + } + } + return isNav; + } + internal static bool IsSqlParameterDbType(ExpressionContext context, Expression member) { var isNav = false;