diff --git a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableHelper.cs b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableHelper.cs index 6e4456edc..9c9b7d718 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableHelper.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableHelper.cs @@ -1434,9 +1434,11 @@ namespace SqlSugar var ps = this.QueryBuilder.Parameters; var itemProperty = typeof(TResult).GetProperty(subPara.Key); var callType = itemProperty.PropertyType.GetGenericArguments()[0]; - var methodParamters = new object[] { subPara.Value.ObjToString().Replace("@sugarIndex", "0"), ps }; + var sql = subPara.Value.ObjToString().Replace("@sugarIndex", "0"); + sql =SqlBuilder.RemoveParentheses(sql); + var methodParamters = new object[] { sql, ps }; var subList = ExpressionBuilderHelper.CallFunc(callType, methodParamters, this.Clone(), "SubQueryList"); - for(var i=0;i names = new List(); + var allShortName = new List(); + allShortName.Add(this.Builder.SqlTranslationLeft + Builder.GetNoTranslationColumnName(this.TableShortName.ObjToString().ToLower() + this.Builder.SqlTranslationRight + ".")); + if (this.JoinQueryInfos.HasValue()) + { + foreach (var item in this.JoinQueryInfos) + { + allShortName.Add(this.Builder.SqlTranslationLeft + Builder.GetNoTranslationColumnName(item.ShortName.ObjToString().ToLower() + this.Builder.SqlTranslationRight + ".")); + } + } + else if (this.EasyJoinInfos != null && this.EasyJoinInfos.Any()) + { + Check.ExceptionEasy("No Supprt Subquery.ToList(), Inner Join Or Left Join", "Subquery.ToList请使用Inner方式联表"); + } + if (this.TableShortName == null) + { + //Empty + } + else + { + var name = Builder.GetTranslationColumnName(this.TableShortName) + @"\."; + foreach (var paramter in this.SubToListParameters) + { + var regex = $@"\{Builder.SqlTranslationLeft}[\w]{{1,20}}?\{Builder.SqlTranslationRight}\.\{Builder.SqlTranslationLeft}.{{1,50}}?\{Builder.SqlTranslationRight}"; + var matches = Regex + .Matches(paramter.Value.ObjToString(), regex, RegexOptions.IgnoreCase).Cast() + .Where(it => allShortName.Any(z => it.Value.ObjToString().ToLower().Contains(z))) + .Select(it => it.Value).ToList(); + names.AddRange(matches); + } + int i = 0; + names = names.Distinct().ToList(); + if (names.Any()) + { + List colums = new List(); + foreach (var item in names) + { + result = (result + $",{item} as app_ext_col_{i}"); + colums.Add(new QueryableAppendColumn() { AsName = $"app_ext_col_{i}", Name = item, Index = i }); + i++; + } + this.AppendColumns = colums; + } + } + + return result; + } #endregion #region Get SQL Partial @@ -613,54 +662,12 @@ namespace SqlSugar } if (this.SubToListParameters!=null&& this.SubToListParameters.Any()) { - List names = new List(); - var allShortName = new List(); - allShortName.Add(this.Builder.SqlTranslationLeft+ Builder.GetNoTranslationColumnName(this.TableShortName.ObjToString().ToLower()+this.Builder.SqlTranslationRight+".")); - if (this.JoinQueryInfos.HasValue()) - { - foreach (var item in this.JoinQueryInfos) - { - allShortName.Add(this.Builder.SqlTranslationLeft + Builder.GetNoTranslationColumnName(item.ShortName.ObjToString().ToLower() + this.Builder.SqlTranslationRight + ".")); - } - } - else if (this.EasyJoinInfos!=null&& this.EasyJoinInfos.Any()) - { - Check.ExceptionEasy("No Supprt Subquery.ToList(), Inner Join Or Left Join","Subquery.ToList请使用Inner方式联表"); - } - if (this.TableShortName == null) - { - //Empty - } - else - { - var name = Builder.GetTranslationColumnName(this.TableShortName) + @"\."; - foreach (var paramter in this.SubToListParameters) - { - var regex = $@"\{Builder.SqlTranslationLeft}[\w]{{1,20}}?\{Builder.SqlTranslationRight}\.\{Builder.SqlTranslationLeft}.{{1,50}}?\{Builder.SqlTranslationRight}"; - var matches = Regex - .Matches(paramter.Value.ObjToString(), regex, RegexOptions.IgnoreCase).Cast() - .Where(it => allShortName.Any(z => it.Value.ObjToString().ToLower().Contains(z))) - .Select(it => it.Value).ToList(); - names.AddRange(matches); - } - int i = 0; - names = names.Distinct().ToList(); - if (names.Any()) - { - List colums = new List(); - foreach (var item in names) - { - result = (result + $",{item} as app_ext_col_{i}"); - colums.Add(new QueryableAppendColumn() { AsName = $"app_ext_col_{i}", Name = item, Index = i }); - i++; - } - this.AppendColumns = colums; - } - } + result = SubToListMethod(result); } return result; } } + public virtual string GetSelectValueByExpression() { var expression = this.SelectValue as Expression; @@ -843,6 +850,7 @@ namespace SqlSugar #region NoCopy internal bool IsClone { get; set; } public bool NoCheckInclude { get; set; } + public virtual bool IsSelectNoAll { get; set; } = false; #endregion private string GetTableName(string entityName) diff --git a/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/SqlBuilderProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/SqlBuilderProvider.cs index b2bf88cda..36de4479b 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/SqlBuilderProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/SqlBuilderProvider.cs @@ -389,7 +389,12 @@ namespace SqlSugar indexTree++; } - private ConditionalCollections ToConditionalCollections(ConditionalTree item,ref int indexTree, List parameters) + public virtual string RemoveParentheses(string sql) + { + return sql; + } + + private ConditionalCollections ToConditionalCollections(ConditionalTree item,ref int indexTree, List parameters) { List> list = new List>(); var index = 0; diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Common/ExpressionResult.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Common/ExpressionResult.cs index d7577b4b6..cb34b873f 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Common/ExpressionResult.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Common/ExpressionResult.cs @@ -111,7 +111,7 @@ namespace SqlSugar public bool Contains(string value) { if (this.Result.Equals(value)) return true; - return (this.Result.ToString().Contains(value)); + return (this.Result.ToString().ToLower().Contains(value?.ToLower())); } internal void Insert(int index, string value) diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubToList.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubToList.cs index 64ebdf6aa..5e261d377 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubToList.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubToList.cs @@ -45,8 +45,24 @@ namespace SqlSugar {; var exp = expression as MethodCallExpression; InitType(exp); - if (exp.Arguments.Count == 0) + var type=expression.Type; + if (type.FullName.IsCollectionsList() + && exp.Arguments.Count == 0&& type.GenericTypeArguments.Length>0 + && this.Context.SugarContext!=null + &&this.Context.SugarContext.QueryBuilder.IsSelectNoAll) + { + var entity = type.GenericTypeArguments[0]; + var columnNames=this.Context.SugarContext.Context.EntityMaintenance.GetEntityInfo(entity).Columns; + var columnsString = string.Join(",", columnNames + .Where(it => it.IsIgnore == false) + .Where(it => it.DbColumnName.HasValue()) + .Select(it => this.Context.GetTranslationColumnName(it.DbColumnName))); + return $"{columnsString},@sugarIndex as sugarIndex"; + } + else if (exp.Arguments.Count == 0) + { return "*,@sugarIndex as sugarIndex"; + } var argExp = exp.Arguments[0]; var parametres = (argExp as LambdaExpression).Parameters; if ((argExp as LambdaExpression).Body is UnaryExpression) diff --git a/Src/Asp.Net/SqlSugar/Interface/ISqlBuilder.cs b/Src/Asp.Net/SqlSugar/Interface/ISqlBuilder.cs index 37642f870..4a17b8ac0 100644 --- a/Src/Asp.Net/SqlSugar/Interface/ISqlBuilder.cs +++ b/Src/Asp.Net/SqlSugar/Interface/ISqlBuilder.cs @@ -43,5 +43,6 @@ namespace SqlSugar KeyValuePair ConditionalModelToSql(List models, int beginIndex = 0); string GetUnionFomatSql(string sql); Type GetNullType(string tableName,string columnName); + string RemoveParentheses(string sql); } } diff --git a/Src/Asp.Net/SqlSugar/Realization/MySql/SqlBuilder/MySqlFastBuilder.cs b/Src/Asp.Net/SqlSugar/Realization/MySql/SqlBuilder/MySqlFastBuilder.cs index 891878353..5f6a11153 100644 --- a/Src/Asp.Net/SqlSugar/Realization/MySql/SqlBuilder/MySqlFastBuilder.cs +++ b/Src/Asp.Net/SqlSugar/Realization/MySql/SqlBuilder/MySqlFastBuilder.cs @@ -62,9 +62,14 @@ namespace SqlSugar { Check.ExceptionEasy("connection string add : AllowLoadLocalInfile=true", "BulkCopy MySql连接字符串需要添加 AllowLoadLocalInfile=true; 添加后如果还不行Mysql数据库执行一下 SET GLOBAL local_infile=1 "); } - else + else if (ex.Message == "Loading local data is disabled; this must be enabled on both the client and server sides") { - throw ex; + this.Context.Ado.ExecuteCommand("SET GLOBAL local_infile=1"); + Check.ExceptionEasy(ex.Message, " 检测到你没有开启文件,已自动执行 SET GLOBAL local_infile=1 在试一次"); + } + else + { + throw; } } finally diff --git a/Src/Asp.Net/SqlSugar/Realization/MySql/SqlBuilder/MySqlQueryBuilder.cs b/Src/Asp.Net/SqlSugar/Realization/MySql/SqlBuilder/MySqlQueryBuilder.cs index f46a795de..15339077b 100644 --- a/Src/Asp.Net/SqlSugar/Realization/MySql/SqlBuilder/MySqlQueryBuilder.cs +++ b/Src/Asp.Net/SqlSugar/Realization/MySql/SqlBuilder/MySqlQueryBuilder.cs @@ -148,6 +148,10 @@ namespace SqlSugar { result = " DISTINCT " + result; } + if (this.SubToListParameters != null && this.SubToListParameters.Any()) + { + result = SubToListMethod(result); + } return result; } } diff --git a/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleBuilder.cs b/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleBuilder.cs index 41e867fc0..ce124b842 100644 --- a/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleBuilder.cs +++ b/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleBuilder.cs @@ -50,6 +50,14 @@ namespace SqlSugar var result = base.GetTranslationColumnName(propertyName); return result.ToUpper(); } + public override string RemoveParentheses(string sql) + { + if (sql.StartsWith("(") && sql.EndsWith(")")) + { + sql = sql.Substring(1, sql.Length - 2); + } + return sql; + } } } diff --git a/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleQueryBuilder.cs b/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleQueryBuilder.cs index 342909a65..06722ef37 100644 --- a/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleQueryBuilder.cs +++ b/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleQueryBuilder.cs @@ -9,6 +9,7 @@ namespace SqlSugar { public class OracleQueryBuilder : QueryBuilder { + public override bool IsSelectNoAll { get; set; } = true; public override bool IsComplexModel(string sql) { return Regex.IsMatch(sql, @"AS ""\w+\.\w+""")|| Regex.IsMatch(sql, @"AS ""\w+\.\w+\.\w+"""); diff --git a/Src/Asp.Net/SqlSugar/Realization/PostgreSQL/SqlBuilder/PostgreSQLQueryBuilder.cs b/Src/Asp.Net/SqlSugar/Realization/PostgreSQL/SqlBuilder/PostgreSQLQueryBuilder.cs index 3c5f64c12..36e43d33c 100644 --- a/Src/Asp.Net/SqlSugar/Realization/PostgreSQL/SqlBuilder/PostgreSQLQueryBuilder.cs +++ b/Src/Asp.Net/SqlSugar/Realization/PostgreSQL/SqlBuilder/PostgreSQLQueryBuilder.cs @@ -108,6 +108,10 @@ namespace SqlSugar { result = "distinct "+result; } + if (this.SubToListParameters != null && this.SubToListParameters.Any()) + { + result = SubToListMethod(result); + } return result; } } diff --git a/Src/Asp.Net/SqlSugar/Realization/QuestDB/SqlBuilder/QuestDBQueryBuilder.cs b/Src/Asp.Net/SqlSugar/Realization/QuestDB/SqlBuilder/QuestDBQueryBuilder.cs index 2ad260073..1387e65d2 100644 --- a/Src/Asp.Net/SqlSugar/Realization/QuestDB/SqlBuilder/QuestDBQueryBuilder.cs +++ b/Src/Asp.Net/SqlSugar/Realization/QuestDB/SqlBuilder/QuestDBQueryBuilder.cs @@ -148,6 +148,10 @@ namespace SqlSugar { result = " DISTINCT " + result; } + if (this.SubToListParameters != null && this.SubToListParameters.Any()) + { + result = SubToListMethod(result); + } return result; } } diff --git a/Src/Asp.Net/SqlSugar/Realization/Sqlite/SqlBuilder/SqliteBuilder.cs b/Src/Asp.Net/SqlSugar/Realization/Sqlite/SqlBuilder/SqliteBuilder.cs index 4e085ecda..18636d55a 100644 --- a/Src/Asp.Net/SqlSugar/Realization/Sqlite/SqlBuilder/SqliteBuilder.cs +++ b/Src/Asp.Net/SqlSugar/Realization/Sqlite/SqlBuilder/SqliteBuilder.cs @@ -22,5 +22,14 @@ namespace SqlSugar return "select DATETIME('now') "; } } + public override string RemoveParentheses(string sql) + { + if (sql.StartsWith("(") && sql.EndsWith(")")) + { + sql = sql.Substring(1, sql.Length - 2); + } + + return sql; + } } } diff --git a/Src/Asp.Net/SqlSugar/Realization/Sqlite/SqlBuilder/SqliteInsertBuilder.cs b/Src/Asp.Net/SqlSugar/Realization/Sqlite/SqlBuilder/SqliteInsertBuilder.cs index 9512ef1fe..b7b9e15b3 100644 --- a/Src/Asp.Net/SqlSugar/Realization/Sqlite/SqlBuilder/SqliteInsertBuilder.cs +++ b/Src/Asp.Net/SqlSugar/Realization/Sqlite/SqlBuilder/SqliteInsertBuilder.cs @@ -148,7 +148,7 @@ namespace SqlSugar { date = UtilMethods.GetMinDate(this.Context.CurrentConnectionConfig); } - return "'" + date.ToString("yyyy-MM-dd HH:mm:ss.fff") + "'"; + return "'" + date.ToString("yyyy-MM-dd HH:mm:ss.fffffff") + "'"; } private object GetDateTimeString(object value) diff --git a/Src/Asp.Net/SqlSugar/Realization/Sqlite/SqlBuilder/SqliteQueryBuilder.cs b/Src/Asp.Net/SqlSugar/Realization/Sqlite/SqlBuilder/SqliteQueryBuilder.cs index 474caac94..504d8c8bc 100644 --- a/Src/Asp.Net/SqlSugar/Realization/Sqlite/SqlBuilder/SqliteQueryBuilder.cs +++ b/Src/Asp.Net/SqlSugar/Realization/Sqlite/SqlBuilder/SqliteQueryBuilder.cs @@ -68,7 +68,7 @@ namespace SqlSugar } return result; } - + #endregion #region Get SQL Partial @@ -93,6 +93,10 @@ namespace SqlSugar { reval = " DISTINCT " + reval; } + if (this.SubToListParameters != null && this.SubToListParameters.Any()) + { + reval = SubToListMethod(reval); + } return reval; } } diff --git a/Src/Asp.Net/SqlSugar/Realization/Sqlite/SqlBuilder/SqliteUpdateBuilder.cs b/Src/Asp.Net/SqlSugar/Realization/Sqlite/SqlBuilder/SqliteUpdateBuilder.cs index b50677c51..e81b25796 100644 --- a/Src/Asp.Net/SqlSugar/Realization/Sqlite/SqlBuilder/SqliteUpdateBuilder.cs +++ b/Src/Asp.Net/SqlSugar/Realization/Sqlite/SqlBuilder/SqliteUpdateBuilder.cs @@ -109,7 +109,7 @@ namespace SqlSugar { date = UtilMethods.GetMinDate(this.Context.CurrentConnectionConfig); } - return "'" + date.ToString("yyyy-MM-dd HH:mm:ss.fff") + "'"; + return "'" + date.ToString("yyyy-MM-dd HH:mm:ss.fffffff") + "'"; } } }