diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableHelper.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableHelper.cs index 67d7d0581..edd1d8d93 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableHelper.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableHelper.cs @@ -884,11 +884,17 @@ namespace SqlSugar #region Other protected string AppendSelect(List entityColumnInfos,string sql, ReadOnlyCollection parameters, List columnsResult, int parameterIndex1) { + var lowerSql = sql.ToLower(); + var isSubquery = lowerSql.Contains("select ") && ExpressionTool.IsMemberInit(this.QueryBuilder.SelectValue); + if (isSubquery) + { + return AppendSelectWithSubQuery(entityColumnInfos, sql, parameters, columnsResult, parameterIndex1); + } var columns = entityColumnInfos; var parameterName = parameters[parameterIndex1]; foreach (var item in columns) { - if (item.IsIgnore == false && columnsResult.Any(it => it.PropertyName.EqualCase(item.PropertyName)) && !sql.ToLower().Contains(SqlBuilder.GetTranslationColumnName(item.PropertyName.ToLower()))) + if (item.IsIgnore == false && columnsResult.Any(it => it.PropertyName.EqualCase(item.PropertyName)) && !lowerSql.Contains(SqlBuilder.GetTranslationColumnName(item.PropertyName.ToLower()))) { sql = $" {sql},{SqlBuilder.GetTranslationColumnName(item.DbColumnName)} AS {SqlBuilder.GetTranslationColumnName(item.PropertyName)} "; } @@ -896,6 +902,28 @@ namespace SqlSugar return sql; } + + private string AppendSelectWithSubQuery(List entityColumnInfos, string sql, ReadOnlyCollection parameters, List columnsResult, int parameterIndex1) + { + var list = ExpressionTool.GetMemberInit(this.QueryBuilder.SelectValue).Bindings.Cast() + .Select(it => it.Member.Name).ToList(); + var columns = entityColumnInfos; + var parameterName = parameters[parameterIndex1]; + if (this.QueryBuilder.AutoAppendedColumns == null) + { + this.QueryBuilder.AutoAppendedColumns = new List(); + } + foreach (var item in columns) + { + if (item.IsIgnore == false &&!this.QueryBuilder.AutoAppendedColumns.Contains(item.PropertyName)&& columnsResult.Any(it => it.PropertyName.EqualCase(item.PropertyName))&& !list.Any(it=>it.EqualCase(item.PropertyName))) + { + sql = $" {sql},{SqlBuilder.GetTranslationColumnName(item.DbColumnName)} AS {SqlBuilder.GetTranslationColumnName(item.PropertyName)} "; + this.QueryBuilder.AutoAppendedColumns.Add(item.PropertyName); + } + } + return sql; + } + protected string AppendSelect(string sql, ReadOnlyCollection parameters, List columnsResult, int parameterIndex1) { var columns = this.Context.EntityMaintenance.GetEntityInfo().Columns; diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs index 3ca8e20f7..3c78d3186 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs @@ -851,6 +851,7 @@ namespace SqlSugar internal bool IsClone { get; set; } public bool NoCheckInclude { get; set; } public virtual bool IsSelectNoAll { get; set; } = false; + public List AutoAppendedColumns { get; set; } #endregion private string GetTableName(string entityName) diff --git a/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs b/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs index 7035b5396..d6b8eec2c 100644 --- a/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs +++ b/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs @@ -575,5 +575,47 @@ namespace SqlSugar } return false; } + + internal static bool IsMemberInit(object selectValue) + { + var result = false; + if (selectValue is Expression) + { + if (selectValue is MemberInitExpression) + { + result = true; + } + else if (selectValue is LambdaExpression) + { + var lambda = (LambdaExpression)selectValue; + if (lambda.Body is MemberInitExpression) + { + result = true; + } + } + } + return result; + } + + internal static MemberInitExpression GetMemberInit(object selectValue) + { + MemberInitExpression result = null; + if (selectValue is Expression) + { + if (selectValue is MemberInitExpression) + { + result = (MemberInitExpression)selectValue; + } + else if (selectValue is LambdaExpression) + { + var lambda = (LambdaExpression)selectValue; + if (lambda.Body is MemberInitExpression) + { + result = (MemberInitExpression)lambda.Body; + } + } + } + return result; + } } }