From 4e1c178d24120ef0792d443538564042942b1eca Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Fri, 29 Sep 2023 15:49:10 +0800 Subject: [PATCH] Optimize multi-field navigation --- .../QueryableProvider/NavigatManager.cs | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/NavigatManager.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/NavigatManager.cs index ea5447c6b..6bae3d1f1 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/NavigatManager.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/NavigatManager.cs @@ -491,7 +491,7 @@ namespace SqlSugar private void Dynamic(List list, Func, List> selector, EntityInfo listItemEntity, System.Reflection.PropertyInfo navObjectNamePropety, EntityColumnInfo navObjectNameColumnInfo,Expression expression) { var args = navObjectNameColumnInfo.PropertyInfo.PropertyType.GetGenericArguments(); - if (args.Length == 0) + if (args.Length == 0) { DynamicOneToOne(list,selector,listItemEntity, navObjectNamePropety, navObjectNameColumnInfo,expression); return; @@ -504,6 +504,10 @@ namespace SqlSugar childDb.InitMappingInfo(navEntity); var navEntityInfo = childDb.EntityMaintenance.GetEntityInfo(navEntity); var sqlObj = GetWhereSql(navObjectNameColumnInfo.Navigat.Name); + if (IsJsonMapping(navObjectNameColumnInfo, sqlObj)) + { + CreateDynamicMappingExpression(sqlObj, navObjectNameColumnInfo.Navigat.Name, navEntityInfo, listItemEntity); + } Check.ExceptionEasy(sqlObj.MappingExpressions.IsNullOrEmpty(), $"{expression} error,dynamic need MappingField ,Demo: Includes(it => it.Books.MappingField(z=>z.studenId,()=>it.StudentId).ToList())", $"{expression} 解析出错,自定义映射需要 MappingField ,例子: Includes(it => it.Books.MappingField(z=>z.studenId,()=>it.StudentId).ToList())"); if (list.Any() && navObjectNamePropety.GetValue(list.First()) == null) { @@ -846,5 +850,31 @@ namespace SqlSugar navPkColumn?.SqlParameterDbType == null && this.Context?.CurrentConnectionConfig?.MoreSettings?.TableEnumIsString != true; } + + private static bool IsJsonMapping(EntityColumnInfo navObjectNameColumnInfo, SqlInfo sqlObj) + { + return sqlObj.MappingExpressions == null && navObjectNameColumnInfo.Navigat.Name.HasValue(); + } + + private void CreateDynamicMappingExpression(SqlInfo sqlObj, string name, EntityInfo navEntityInfo, EntityInfo listItemEntity) + { + var json = Newtonsoft.Json.Linq.JArray.Parse(name); + sqlObj.MappingExpressions = new List(); + foreach (var item in json) + { + string m = item["m"]+""; + string c = item["c"] + ""; + Check.ExceptionEasy(m.IsNullOrEmpty() || c.IsNullOrEmpty(), $"{name} Navigation json format error, see documentation", $"{name}导航json格式错误,请看文档"); + var cColumn= navEntityInfo.Columns.FirstOrDefault(it => it.PropertyName.EqualCase(c)); + Check.ExceptionEasy(cColumn==null, $"{c} does not exist in {navEntityInfo.EntityName}", $"{c}不存在于{navEntityInfo.EntityName}"); + var mColumn = listItemEntity.Columns.FirstOrDefault(it => it.PropertyName.EqualCase(m)); + Check.ExceptionEasy(cColumn == null, $"{m} does not exist in {listItemEntity.EntityName}", $"{m}不存在于{listItemEntity.EntityName}"); + sqlObj.MappingExpressions.Add(new MappingFieldsExpression() { + + LeftEntityColumn = cColumn, + RightEntityColumn = mColumn, + }); + } + } } }