From 0952b28c68c6d4dd5b5f0354996ebd29d04b015c Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Fri, 15 Jul 2022 13:32:18 +0800 Subject: [PATCH] Update .net core project --- .../QueryableProvider/QueryableProvider.cs | 16 ++++ .../SqlBuilderProvider/QueryBuilder.cs | 2 +- .../SqlSugar/Entities/JoinQueryInfo.cs | 1 + .../Common/ExpressionOutParameter.cs | 1 + .../ExpressionsToSql/Common/ExpressionTool.cs | 27 +++++++ .../ResolveItems/MemberExpressionResolve.cs | 74 ++++++++++++++----- .../ResolveItems/OneToOneNavgateExpression.cs | 6 +- .../SqlSugar/Interface/IQueryable.cs | 1 + 8 files changed, 107 insertions(+), 21 deletions(-) diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs index b476ae77e..dd097835b 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs @@ -46,6 +46,22 @@ namespace SqlSugar return this.Context.EntityMaintenance.GetEntityInfo(); } } + public ISugarQueryable IncludeLeftJoin(Expression> LeftObject) + { + MemberExpression memberExpression; + string navObjectName; + EntityColumnInfo navColumn, navPkColumn; + EntityInfo navEntityInfo; + ExpressionTool.GetOneToOneInfo(this.Context,LeftObject, out memberExpression, out navObjectName, out navColumn, out navEntityInfo, out navPkColumn); + var shortName = $"pnv_{navObjectName}"; + var mainShortName = memberExpression.Expression.ToString(); + this.QueryBuilder.TableShortName = mainShortName; + var onWhere = $"{shortName}.{navPkColumn.DbColumnName}={mainShortName}.{navColumn.DbColumnName}"; + UtilMethods.IsNullReturnNew(this.Context.TempItems); + this.AddJoinInfo(navEntityInfo.DbTableName, shortName, onWhere, JoinType.Left); + return this; + } + public ISugarQueryable LeftJoin(ISugarQueryable joinQueryable, Expression> joinExpression) { this.Context.InitMappingInfo(); diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs index d34bb1aa1..a7746c231 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs @@ -246,7 +246,7 @@ namespace SqlSugar { resolveExpress.PgSqlIsAutoToLower = true; } - resolveExpress.SugarContext = new ExpressionOutParameter() { Context = this.Context }; + resolveExpress.SugarContext = new ExpressionOutParameter() { Context = this.Context, QueryBuilder = this } ; resolveExpress.RootExpression = expression; resolveExpress.JoinQueryInfos = Builder.QueryBuilder.JoinQueryInfos; resolveExpress.IsSingle = IsSingle()&& resolveType!= ResolveExpressType.WhereMultiple; diff --git a/Src/Asp.NetCore2/SqlSugar/Entities/JoinQueryInfo.cs b/Src/Asp.NetCore2/SqlSugar/Entities/JoinQueryInfo.cs index aa07be19a..51a25591b 100644 --- a/Src/Asp.NetCore2/SqlSugar/Entities/JoinQueryInfo.cs +++ b/Src/Asp.NetCore2/SqlSugar/Entities/JoinQueryInfo.cs @@ -6,6 +6,7 @@ using System.Text; namespace SqlSugar { + public class JoinQueryInfo { public JoinType JoinType { get; set; } diff --git a/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Common/ExpressionOutParameter.cs b/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Common/ExpressionOutParameter.cs index d113e723f..da0df7427 100644 --- a/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Common/ExpressionOutParameter.cs +++ b/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Common/ExpressionOutParameter.cs @@ -9,5 +9,6 @@ namespace SqlSugar public class ExpressionOutParameter { public SqlSugarProvider Context { get; set; } + public QueryBuilder QueryBuilder { get; set; } } } diff --git a/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs b/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs index 8d24ab674..5459ff517 100644 --- a/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs +++ b/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs @@ -60,6 +60,33 @@ namespace SqlSugar } } + + public static void GetOneToOneInfo(SqlSugarProvider context,Expression> LeftObject, out MemberExpression memberExpression, out string navObjectName, out EntityColumnInfo navColumn, out EntityInfo navEntityInfo, out EntityColumnInfo navPkColumn) + { + memberExpression = ((LeftObject as LambdaExpression).Body as MemberExpression); + var listItemType = typeof(T); + var listItemEntity = context.EntityMaintenance.GetEntityInfo(listItemType); + var listPkColumn = listItemEntity.Columns.Where(it => it.IsPrimarykey).FirstOrDefault(); + navObjectName = memberExpression.Member.Name; + var navObjectName2 = navObjectName; + var navObjectNamePropety = listItemType.GetProperty(navObjectName); + var navObjectNameColumnInfo = listItemEntity.Columns.First(it => it.PropertyName == navObjectName2); + Check.ExceptionEasy(navObjectNameColumnInfo.Navigat == null, $"{navObjectName} not [Navigat(..)] ", $"{navObjectName} 没有导航特性 [Navigat(..)] "); + Check.ExceptionEasy(navObjectNameColumnInfo.Navigat.NavigatType != NavigateType.OneToOne, $"IncludeLeftJoin can only be one-on-one ", $"IncludeLeftJoin 只能是一对一 "); + navColumn = listItemEntity.Columns.FirstOrDefault(it => it.PropertyName == navObjectNameColumnInfo.Navigat.Name); + Check.ExceptionEasy(navColumn == null, "OneToOne navigation configuration error", $"OneToOne导航配置错误: 实体{ listItemEntity.EntityName } 不存在{navObjectNameColumnInfo.Navigat.Name}"); + var navType = navObjectNamePropety.PropertyType; + navEntityInfo = context.EntityMaintenance.GetEntityInfo(navType); + context.InitMappingInfo(navEntityInfo.Type); + navPkColumn = navEntityInfo.Columns.Where(it => it.IsPrimarykey).FirstOrDefault(); + Check.ExceptionEasy(navPkColumn == null && navObjectNameColumnInfo.Navigat.Name2 == null, navEntityInfo.EntityName + "need primarykey", navEntityInfo.EntityName + " 需要主键"); + if (navObjectNameColumnInfo.Navigat.Name2.HasValue()) + { + navPkColumn = navEntityInfo.Columns.Where(it => it.PropertyName == navObjectNameColumnInfo.Navigat.Name2).FirstOrDefault(); + } + } + + public static List ExpressionParameters(Expression expression) { List parameters = null; diff --git a/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/ResolveItems/MemberExpressionResolve.cs b/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/ResolveItems/MemberExpressionResolve.cs index 2172ae3f1..3e264956f 100644 --- a/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/ResolveItems/MemberExpressionResolve.cs +++ b/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/ResolveItems/MemberExpressionResolve.cs @@ -3,6 +3,8 @@ using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; +using System.Text.RegularExpressions; + namespace SqlSugar { public class MemberExpressionResolve : BaseResolve @@ -75,31 +77,39 @@ namespace SqlSugar var navN = new OneToOneNavgateExpressionN(this.Context?.SugarContext?.Context); if (nav.IsNavgate(expression)) { - var value = nav.GetSql(); - SetNavigateResult(); - this.Context.SingleTableNameSubqueryShortName = nav.ShorName; - if (isSetTempData) + if (this.Context?.SugarContext?.QueryBuilder?.JoinQueryInfos != null) { - baseParameter.CommonTempData = value; + var p=expression.Expression.ObjToString(); + var querybuilder = this.Context?.SugarContext?.QueryBuilder; + var joinInfos = querybuilder.JoinQueryInfos; + var joinInfo=joinInfos.FirstOrDefault(it => $"{querybuilder.TableShortName}.{ it.ShortName.Replace("pnv_","")}" == p); + if (joinInfo != null) + { + var columnInfo=nav.ProPertyEntity.Columns.FirstOrDefault(it => it.PropertyName == nav.MemberName); + var value =new MapperSql() { Sql = joinInfo.ShortName + "." + columnInfo.DbColumnName }; + + if (isSetTempData) + { + baseParameter.CommonTempData = value; + } + else + { + AppendValue(parameter, isLeft, value); + } + } + else + { + DefaultOneToOne(parameter, baseParameter, isLeft, isSetTempData, nav); + } } else { - AppendValue(parameter, isLeft, value); + DefaultOneToOne(parameter, baseParameter, isLeft, isSetTempData, nav); } } else if (navN.IsNavgate(expression)) { - var value = navN.GetMemberSql(); - SetNavigateResult(); - this.Context.SingleTableNameSubqueryShortName = navN.shorName; - if (isSetTempData) - { - baseParameter.CommonTempData = value; - } - else - { - AppendValue(parameter, isLeft, value); - } + DefaultOneToOneN(parameter, baseParameter, isLeft, isSetTempData, navN); } else { @@ -116,6 +126,36 @@ namespace SqlSugar } } + private void DefaultOneToOneN(ExpressionParameter parameter, ExpressionParameter baseParameter, bool? isLeft, bool isSetTempData, OneToOneNavgateExpressionN navN) + { + var value = navN.GetMemberSql(); + SetNavigateResult(); + this.Context.SingleTableNameSubqueryShortName = navN.shorName; + if (isSetTempData) + { + baseParameter.CommonTempData = value; + } + else + { + AppendValue(parameter, isLeft, value); + } + } + + private void DefaultOneToOne(ExpressionParameter parameter, ExpressionParameter baseParameter, bool? isLeft, bool isSetTempData, OneToOneNavgateExpression nav) + { + var value = nav.GetSql(); + SetNavigateResult(); + this.Context.SingleTableNameSubqueryShortName = nav.ShorName; + if (isSetTempData) + { + baseParameter.CommonTempData = value; + } + else + { + AppendValue(parameter, isLeft, value); + } + } + private static bool IsConvertMemberName(MemberExpression expression) { return expression.Expression is UnaryExpression && (expression.Expression as UnaryExpression).Operand is ParameterExpression; diff --git a/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/ResolveItems/OneToOneNavgateExpression.cs b/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/ResolveItems/OneToOneNavgateExpression.cs index 6ba23b01d..d4e3a6c41 100644 --- a/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/ResolveItems/OneToOneNavgateExpression.cs +++ b/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/ResolveItems/OneToOneNavgateExpression.cs @@ -10,11 +10,11 @@ namespace SqlSugar internal class OneToOneNavgateExpression { private SqlSugarProvider context; - private EntityInfo EntityInfo; - private EntityInfo ProPertyEntity; + internal EntityInfo EntityInfo; + internal EntityInfo ProPertyEntity; private Navigate Navigat; public string ShorName; - private string MemberName; + internal string MemberName; public OneToOneNavgateExpression(SqlSugarProvider context) { this.context = context; diff --git a/Src/Asp.NetCore2/SqlSugar/Interface/IQueryable.cs b/Src/Asp.NetCore2/SqlSugar/Interface/IQueryable.cs index ccea0e449..989b034a7 100644 --- a/Src/Asp.NetCore2/SqlSugar/Interface/IQueryable.cs +++ b/Src/Asp.NetCore2/SqlSugar/Interface/IQueryable.cs @@ -19,6 +19,7 @@ namespace SqlSugar ISugarQueryable AS(string tableName); ISugarQueryable AS(string tableName); ISugarQueryable With(string withString); + ISugarQueryable IncludeLeftJoin(Expression> LeftObject); ISugarQueryable LeftJoin(ISugarQueryable joinQueryable, Expression> joinExpression); ISugarQueryable InnerJoin(ISugarQueryable joinQueryable, Expression> joinExpression); ISugarQueryable RightJoin(ISugarQueryable joinQueryable, Expression> joinExpression);