From 30d9ba390ca0782020355d727233bd917e8deea1 Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Mon, 10 Mar 2025 13:31:08 +0800 Subject: [PATCH] Synchronization code --- .../QueryableProvider/QueryableHelper.cs | 25 +++++++++++++------ .../SqlBuilderProvider/QueryBuilder.cs | 19 +++++++++++--- .../SqlBuilder/SqlServerQueryBuilder.cs | 4 +++ 3 files changed, 38 insertions(+), 10 deletions(-) diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableHelper.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableHelper.cs index a8286d2b5..5b4f99cf4 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableHelper.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableHelper.cs @@ -1731,6 +1731,8 @@ namespace SqlSugar } protected ISugarQueryable _GroupBy(Expression expression) { + var oldParameterNames = this.QueryBuilder.Parameters?.Select(it => it.ParameterName) + ?.ToList(); QueryBuilder.CheckExpression(expression, "GroupBy"); LambdaExpression lambda = expression as LambdaExpression; expression = lambda.Body; @@ -1761,7 +1763,19 @@ namespace SqlSugar lamResult = QueryBuilder.GetExpressionValue(expression, isSingle ? ResolveExpressType.FieldSingle : ResolveExpressType.FieldMultiple); result = lamResult.GetResultString(); } - GroupBy(result); + if (oldParameterNames != null && this.Context.CurrentConnectionConfig.DbType == DbType.SqlServer) + { + var newParas = this.QueryBuilder.Parameters.Where(it => !oldParameterNames.Contains(it.ParameterName)).ToList(); + this.QueryBuilder.GroupParameters = newParas; + var groupBySql = UtilMethods.GetSqlString(DbType.SqlServer, result, newParas.ToArray()); + this.QueryBuilder.GroupBySql = groupBySql; + this.QueryBuilder.GroupBySqlOld = result; + GroupBy(result); + } + else + { + GroupBy(result); + } return this; } protected ISugarQueryable _As(string tableName, string entityName) @@ -2142,6 +2156,9 @@ namespace SqlSugar asyncQueryableBuilder.Hints = this.QueryBuilder.Hints; asyncQueryableBuilder.MasterDbTableName = this.QueryBuilder.MasterDbTableName; asyncQueryableBuilder.IsParameterizedConstructor = this.QueryBuilder.IsParameterizedConstructor; + asyncQueryableBuilder.GroupParameters = this.QueryBuilder.GroupParameters; + asyncQueryableBuilder.GroupBySql = this.QueryBuilder.GroupBySql; + asyncQueryableBuilder.GroupBySqlOld = this.QueryBuilder.GroupBySqlOld; if (this.QueryBuilder.AppendNavInfo != null) { asyncQueryableBuilder.AppendNavInfo = new AppendNavInfo() @@ -2336,12 +2353,6 @@ namespace SqlSugar new SugarParameter("@p",re.Value) }; var value = UtilMethods.GetSqlString(config.DbType, "@p", p, true); - if (this.Context.CurrentConnectionConfig?.DbType == DbType.SqlServer&& - this.Context.CurrentConnectionConfig?.MoreSettings?.DisableNvarchar!=true&& - p?.FirstOrDefault()?.DbType == System.Data.DbType.String) - { - value = "N" + value; - } sql = sql.Replace(re.Name, value); } diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs index 38e033ae0..947b315c3 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs @@ -34,6 +34,9 @@ namespace SqlSugar #endregion #region Splicing basic + public List GroupParameters { get; set; } + public string GroupBySql { get; set; } + public string GroupBySqlOld { get; set; } public Type AsType { get; set; } public bool IsParameterizedConstructor { get; set; } public string Hints { get; set; } @@ -283,7 +286,7 @@ namespace SqlSugar }; resolveExpress.Resolve(expression, resolveType); this.Parameters.AddRange(resolveExpress.Parameters.Select(it => new SugarParameter(it.ParameterName, it.Value, it.DbType) { Size=it.Size,TypeName=it.TypeName, IsNvarchar2=it.IsNvarchar2})); - var result = resolveExpress.Result; + var result = resolveExpress.Result; var isSingleTableHasSubquery = IsSingle() && resolveExpress.SingleTableNameSubqueryShortName.HasValue(); if (isSingleTableHasSubquery) { @@ -919,7 +922,16 @@ namespace SqlSugar { result = result + " AS columnName"; } - this.SelectCacheKey = result; + if (this.GroupParameters?.Any()==true && this.GroupBySql.HasValue()) + { + var selectSql = UtilMethods.GetSqlString(DbType.SqlServer, result, UtilMethods.CopySugarParameters(this.Parameters).ToArray()); + if (selectSql.Contains(this.GroupBySql)) + { + result = selectSql; + this.GroupByIsReplace = true; + } + } + this.SelectCacheKey = result; return result; } } @@ -1085,12 +1097,13 @@ namespace SqlSugar #region NoCopy + internal bool GroupByIsReplace { get; set; } internal List QueryableFormats { get; set; } internal bool IsClone { get; set; } public bool NoCheckInclude { get; set; } public virtual bool IsSelectNoAll { get; set; } = false; public List AutoAppendedColumns { get; set; } - public Dictionary MappingKeys { get; set; } + public Dictionary MappingKeys { get; set; } #endregion private string GetTableName(string entityName) diff --git a/Src/Asp.NetCore2/SqlSugar/Realization/SqlServer/SqlBuilder/SqlServerQueryBuilder.cs b/Src/Asp.NetCore2/SqlSugar/Realization/SqlServer/SqlBuilder/SqlServerQueryBuilder.cs index a0417bafb..5eecca98b 100644 --- a/Src/Asp.NetCore2/SqlSugar/Realization/SqlServer/SqlBuilder/SqlServerQueryBuilder.cs +++ b/Src/Asp.NetCore2/SqlSugar/Realization/SqlServer/SqlBuilder/SqlServerQueryBuilder.cs @@ -108,6 +108,10 @@ namespace SqlSugar { result = result.Replace("TOP 1 DISTINCT", "TOP 1 "); } + if (this.GroupParameters?.Any() == true&&this.GroupByIsReplace) + { + result = result.Replace(this.GroupBySqlOld, this.GroupBySql); + } return result; }