From 9dcff076f1174ed136347daba4c14dac59366c83 Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Fri, 29 Sep 2023 16:05:17 +0800 Subject: [PATCH] Synchronization code --- .../QueryableProvider/NavigatManager.cs | 36 ++++++++++++++++++- .../QueryableProvider/QueryableProvider.cs | 11 +++++- Src/Asp.Net/SqlSugar/Interface/IQueryable.cs | 2 ++ .../Json2Sql/DynamicLinq/DynamicCoreHelper.cs | 20 +++++++++++ 4 files changed, 67 insertions(+), 2 deletions(-) diff --git a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/NavigatManager.cs b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/NavigatManager.cs index ea5447c6b3..946da5acfc 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/NavigatManager.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/NavigatManager.cs @@ -491,7 +491,7 @@ select new 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 @@ private void Dynamic(List list, Func, List 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) { @@ -530,6 +534,10 @@ private void DynamicOneToOne(List list, Func, Li var navEntityInfo = this.Context.EntityMaintenance.GetEntityInfo(navEntity); this.Context.InitMappingInfo(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 +854,31 @@ private bool IsEnumNumber(EntityColumnInfo navPkColumn) 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, + }); + } + } } } diff --git a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs index e0dca9093e..591627a32c 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs @@ -8,7 +8,7 @@ using System.Text.RegularExpressions; using System.Reflection; using System.Dynamic; -using System.Threading.Tasks; +using System.Threading.Tasks; namespace SqlSugar { @@ -1339,6 +1339,15 @@ public virtual ISugarQueryable Select(Expression expression) } return _Select(expression); } + public ISugarQueryable Select(string expShortName, FormattableString expSelect, Type propertyType) + { + var exp = DynamicCoreHelper.GetMember(typeof(TResult),propertyType, expShortName, expSelect); + return _Select(exp); + } + public ISugarQueryable Select(string expShortName, FormattableString expSelect,Type propertyType) + { + return Select(expShortName, expSelect, propertyType); + } public virtual ISugarQueryable Select(Expression> expression) { if (IsAppendNavColumns()) diff --git a/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs b/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs index cedc0be92b..bc8c4bf9e5 100644 --- a/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs +++ b/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs @@ -151,6 +151,8 @@ public partial interface ISugarQueryable Task AnyAsync(Expression> expression, CancellationToken token); bool Any(); Task AnyAsync(); + ISugarQueryable Select(string expShortName, FormattableString expSelect, Type propertyType); + ISugarQueryable Select(string expShortName, FormattableString expSelect, Type propertyType); ISugarQueryable Select(Expression expression); ISugarQueryable Select(Expression> expression); ISugarQueryable Select(Expression> expression,bool isAutoFill); diff --git a/Src/Asp.Net/SqlSugar/Json2Sql/DynamicLinq/DynamicCoreHelper.cs b/Src/Asp.Net/SqlSugar/Json2Sql/DynamicLinq/DynamicCoreHelper.cs index 512ade93c4..788f45963e 100644 --- a/Src/Asp.Net/SqlSugar/Json2Sql/DynamicLinq/DynamicCoreHelper.cs +++ b/Src/Asp.Net/SqlSugar/Json2Sql/DynamicLinq/DynamicCoreHelper.cs @@ -32,6 +32,26 @@ public static LambdaExpression GetWhere(Type entityType, string shortName, Forma return lambda; } + public static LambdaExpression GetMember(Type entityType,Type propertyType, string shortName, FormattableString memberSql) + { + var parameter = Expression.Parameter(entityType, "it"); + + // 提取 FormattableString 中的参数值 + var arguments = memberSql.GetArguments(); + + + var sql = ReplaceFormatParameters(memberSql.Format); + + // 构建动态表达式,使用常量表达式和 whereSql 中的参数值 + var lambda = SqlSugarDynamicExpressionParser.ParseLambda( + new[] { parameter }, + propertyType, + sql, + memberSql.GetArguments() + ); + + return lambda; + } private static string ReplaceFormatParameters(string format) { int parameterIndex = 0; // 起始参数索引