diff --git a/Src/Asp.Net/SqlSugar/Abstract/DbBindProvider/IDataReaderEntityBuilder.cs b/Src/Asp.Net/SqlSugar/Abstract/DbBindProvider/IDataReaderEntityBuilder.cs index 32a985ca9..6a002ba7c 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/DbBindProvider/IDataReaderEntityBuilder.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/DbBindProvider/IDataReaderEntityBuilder.cs @@ -121,6 +121,10 @@ namespace SqlSugar if (columnInfo != null && columnInfo.PropertyInfo.GetSetMethod(true) != null) { var isGemo = columnInfo.PropertyInfo?.PropertyType?.FullName=="NetTopologySuite.Geometries.Geometry"; + if (isGemo == false && columnInfo.PropertyInfo?.PropertyType?.FullName == "Kdbndp.LegacyPostgis.PostgisGeometry") + { + isGemo = true; + } if (!isGemo&&columnInfo.PropertyInfo.PropertyType.IsClass() && columnInfo.PropertyInfo.PropertyType != UtilConstants.ByteArrayType && columnInfo.PropertyInfo.PropertyType != UtilConstants.ObjType) { if (this.ReaderKeys.Any(it => it.Equals(fileName, StringComparison.CurrentCultureIgnoreCase))) diff --git a/Src/Asp.Net/SqlSugar/Abstract/DbMaintenanceProvider/Methods.cs b/Src/Asp.Net/SqlSugar/Abstract/DbMaintenanceProvider/Methods.cs index e7c88b586..7dee96cb2 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/DbMaintenanceProvider/Methods.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/DbMaintenanceProvider/Methods.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Data.Common; using System.IO; using System.Linq; using System.Reflection; @@ -676,7 +677,11 @@ namespace SqlSugar { var db = this.Context; var columns = entity.Columns.Where(it => it.IsIgnore == false).ToList(); - + List dbColumn = new List(); + if (entity.Columns.Any(it => it.ColumnDescription.HasValue())) + { + dbColumn=db.DbMaintenance.GetColumnInfosByTableName(entity.DbTableName, false); + } foreach (var item in columns) { if (item.ColumnDescription != null) @@ -684,8 +689,11 @@ namespace SqlSugar //column remak if (db.DbMaintenance.IsAnyColumnRemark(item.DbColumnName, item.DbTableName)) { - db.DbMaintenance.DeleteColumnRemark(item.DbColumnName, item.DbTableName); - db.DbMaintenance.AddColumnRemark(item.DbColumnName, item.DbTableName, item.ColumnDescription); + if (!dbColumn.Any(it => it.DbColumnName == item.DbColumnName && it.ColumnDescription == item.ColumnDescription)) + { + db.DbMaintenance.DeleteColumnRemark(item.DbColumnName, item.DbTableName); + db.DbMaintenance.AddColumnRemark(item.DbColumnName, item.DbTableName, item.ColumnDescription); + } } else { diff --git a/Src/Asp.Net/SqlSugar/Abstract/DeleteProvider/DeleteNavMethodInfo.cs b/Src/Asp.Net/SqlSugar/Abstract/DeleteProvider/DeleteNavMethodInfo.cs index eb8989421..9e4611321 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/DeleteProvider/DeleteNavMethodInfo.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/DeleteProvider/DeleteNavMethodInfo.cs @@ -11,7 +11,7 @@ namespace SqlSugar internal object MethodInfos { get; set; } internal SqlSugarProvider Context { get; set; } - public DeleteNavMethodInfo IncludeByNameString(string navMemberName, DeleteNavOptions updateNavOptions = null) + public DeleteNavMethodInfo IncludeByNameString(string navMemberName, DeleteNavOptions deleteNavOptions = null) { var type = MethodInfos.GetType().GetGenericArguments()[0]; var entityInfo = this.Context.EntityMaintenance.GetEntityInfo(type); @@ -20,11 +20,11 @@ namespace SqlSugar Expression exp = UtilMethods.GetIncludeExpression(navMemberName, entityInfo, out properyItemType, out isList); var method = this.MethodInfos.GetType().GetMyMethod("Include", 2, isList) .MakeGenericMethod(properyItemType); - var obj = method.Invoke(this.MethodInfos, new object[] { exp, updateNavOptions }); + var obj = method.Invoke(this.MethodInfos, new object[] { exp, deleteNavOptions }); this.MethodInfos = obj; return this; } - public DeleteNavMethodInfo ThenIncludeByNameString(string navMemberName, DeleteNavOptions updateNavOptions = null) + public DeleteNavMethodInfo ThenIncludeByNameString(string navMemberName, DeleteNavOptions deleteNavOptions = null) { var type = MethodInfos.GetType().GetGenericArguments()[1]; var entityInfo = this.Context.EntityMaintenance.GetEntityInfo(type); @@ -33,7 +33,7 @@ namespace SqlSugar Expression exp = UtilMethods.GetIncludeExpression(navMemberName, entityInfo, out properyItemType, out isList); var method = this.MethodInfos.GetType().GetMyMethod("ThenInclude", 2, isList) .MakeGenericMethod(properyItemType); - var obj = method.Invoke(this.MethodInfos, new object[] { exp, updateNavOptions }); + var obj = method.Invoke(this.MethodInfos, new object[] { exp, deleteNavOptions }); this.MethodInfos = obj; return this; } diff --git a/Src/Asp.Net/SqlSugar/Abstract/EntityMaintenance/EntityMaintenance.cs b/Src/Asp.Net/SqlSugar/Abstract/EntityMaintenance/EntityMaintenance.cs index 90916e5c4..882baca52 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/EntityMaintenance/EntityMaintenance.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/EntityMaintenance/EntityMaintenance.cs @@ -212,6 +212,10 @@ namespace SqlSugar { return null; } + if (entityType.Assembly.FullName.StartsWith("System.Linq.Dynamic.Core.DynamicClasses")) + { + return null; + } var path = entityType.Assembly.Location; if (string.IsNullOrEmpty(path)) { diff --git a/Src/Asp.Net/SqlSugar/Abstract/FastestProvider/FastestProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/FastestProvider/FastestProvider.cs index 2babbbe3a..4ed1956f3 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/FastestProvider/FastestProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/FastestProvider/FastestProvider.cs @@ -198,6 +198,18 @@ namespace SqlSugar var result = (Task)bulkCopyMethod.Invoke(fastestMethod, new object[] { newValue }); return result; } + public int BulkMerge(DataTable dataTable, string[] whereColumns, string[] updateColumns, bool isIdentity) + { + return BulkMergeAsync(dataTable, whereColumns, updateColumns, isIdentity).GetAwaiter().GetResult(); + } + public Task BulkMergeAsync(DataTable dataTable, string[] whereColumns, string[] updateColumns, bool isIdentity) + { + object newValue, fastestMethod; + MethodInfo bulkCopyMethod; + _BulkMerge(dataTable, whereColumns,updateColumns, out newValue, out fastestMethod, out bulkCopyMethod, true, isIdentity); + var result = (Task)bulkCopyMethod.Invoke(fastestMethod, new object[] { newValue,whereColumns,updateColumns }); + return result; + } public Task BulkMergeAsync(List datas, string[] whereColumns) { var updateColumns = entityInfo.Columns.Where(it => !it.IsPrimarykey && !it.IsIdentity && !it.IsOnlyIgnoreUpdate && !it.IsIgnore).Select(it => it.DbColumnName ?? it.PropertyName).ToArray(); @@ -303,6 +315,40 @@ namespace SqlSugar .Invoke(this.context, null); bulkCopyMethod = fastestMethod.GetType().GetMyMethod(isAsync? "BulkMergeAsync" : "BulkMerge", 1); } + private void _BulkMerge(DataTable dataTable, string[] whereColumns,string [] updateColumns, out object newValue, out object fastestMethod, out MethodInfo bulkCopyMethod, bool isAsync, bool isIdentity) + { + Check.ExceptionEasy(this.AsName.IsNullOrEmpty(), "need .AS(tablaeName) ", "需要 .AS(tablaeName) 设置表名"); + var className = "BulkMerge_" + isIdentity + this.AsName.GetNonNegativeHashCodeString(); + var builder = this.context.DynamicBuilder().CreateClass(className, new SugarTable() + { + TableName = this.AsName + }); + foreach (DataColumn item in dataTable.Columns) + { + var isPrimaryKey = whereColumns.Any(it => it.EqualCase(item.ColumnName)); + var propertyType = item.DataType; + if (!propertyType.IsClass() && propertyType != typeof(string) && propertyType != typeof(byte[])) + { + propertyType = typeof(Nullable<>).MakeGenericType(UtilMethods.GetUnderType(item.DataType)); + } + builder.CreateProperty(item.ColumnName, propertyType, new SugarColumn() + { + IsPrimaryKey = isPrimaryKey, + IsIdentity = isIdentity && isPrimaryKey, + IsNullable = true, + + }); + } + var dicList = this.context.Utilities.DataTableToDictionaryList(dataTable); + var type = builder.WithCache().BuilderType(); + var value = this.context.DynamicBuilder().CreateObjectByType(type, dicList); + newValue = UtilMethods.ConvertToObjectList(type, value); + fastestMethod = this.context.GetType() + .GetMethod("Fastest") + .MakeGenericMethod(type) + .Invoke(this.context, null); + bulkCopyMethod = fastestMethod.GetType().GetMyMethod(isAsync ? "BulkMergeAsync" : "BulkMerge", 3, newValue.GetType(), typeof(string[]), typeof(string[])); + } private async Task _BulkUpdate(List datas, string[] whereColumns, string[] updateColumns) { diff --git a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/Includes.cs b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/Includes.cs index 6e5fb317d..105773980 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/Includes.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/Includes.cs @@ -175,7 +175,12 @@ namespace SqlSugar { properyItemType = properyType.GetGenericArguments()[0]; } - var exp = ExpressionBuilderHelper.CreateExpressionSelectField(typeof(T), item.PropertyName, properyType); + var shortName = "it"; + if (this.QueryBuilder.TableShortName.HasValue()) + { + shortName = this.QueryBuilder.TableShortName; + } + var exp = ExpressionBuilderHelper.CreateExpressionSelectField(typeof(T), item.PropertyName, properyType,shortName); var method = this.GetType().GetMethods().Where(it => it.Name == "IncludesByExpression") .First() .MakeGenericMethod(properyItemType); diff --git a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryMethodInfo.cs b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryMethodInfo.cs index 41d5c782c..f760439ff 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryMethodInfo.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryMethodInfo.cs @@ -164,7 +164,12 @@ namespace SqlSugar this.QueryableObj = method.Invoke(QueryableObj, new object[] { }); return this; } - + public QueryMethodInfo Select(string expShortName, List columns, params object[] args) + { + var method = QueryableObj.GetType().GetMyMethod("Select", 3, typeof(string), typeof(List), typeof(object[])); + this.QueryableObj = method.Invoke(QueryableObj, new object[] { expShortName,columns,args }); + return this; + } public QueryMethodInfo Select(List models) { var method = QueryableObj.GetType().GetMyMethod("Select", 1, typeof(List)); diff --git a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSql.cs b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSql.cs index 2cfab50c7..2f685a8ff 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSql.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSql.cs @@ -453,6 +453,43 @@ namespace SqlSugar } return ToDataTable(); } + + public DataTable ToOffsetDataTablePage(int pageNumber, int pageSize) + { + if (this.Context.CurrentConnectionConfig.DbType != DbType.SqlServer) + { + this.QueryBuilder.Offset = "true"; + return this.ToDataTablePage(pageNumber, pageSize); + } + else + { + _ToOffsetPage(pageNumber, pageSize); + return this.ToDataTable(); + } + } + public DataTable ToOffsetDataTablePage(int pageNumber, int pageSize, ref int totalNumber) + { + if (this.Context.CurrentConnectionConfig.DbType != DbType.SqlServer) + { + this.QueryBuilder.Offset = "true"; + return this.ToDataTablePage(pageNumber, pageSize, ref totalNumber); + } + else + { + totalNumber = this.Clone().Count(); + _ToOffsetPage(pageNumber, pageSize); + return this.Clone().ToDataTable(); + } + } + public DataTable ToOffsetDataTableByEntityPage(int pageNumber, int pageSize, ref int totalNumber) + { + return this.Context.Utilities.ListToDataTable(this.ToOffsetPage(pageNumber, pageSize,ref totalNumber)); + } + public DataTable ToOffsetDataTablePage(int pageNumber, int pageSize, ref int totalNumber, ref int totalPage) + { + return this.Context.Utilities.ListToDataTable(this.ToOffsetPage(pageNumber, pageSize, ref totalNumber,ref totalPage)); + } + public DataTable ToDataTableByEntityPage(int pageNumber, int pageSize, ref int totalNumber) { var list=this.ToPageList(pageNumber, pageSize,ref totalNumber); diff --git a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSqlAsync.cs b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSqlAsync.cs index 834f9873e..441c9566b 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSqlAsync.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSqlAsync.cs @@ -355,6 +355,39 @@ namespace SqlSugar var list =await this.ToListAsync(); return this.Context.Utilities.ListToDataTable(list); } + + public Task ToOffsetDataTablePageAsync(int pageNumber, int pageSize) + { + if (this.Context.CurrentConnectionConfig.DbType != DbType.SqlServer) + { + this.QueryBuilder.Offset = "true"; + return this.ToDataTablePageAsync(pageNumber, pageSize); + } + else + { + _ToOffsetPage(pageNumber, pageSize); + return this.ToDataTableAsync(); + } + } + public async Task ToOffsetDataTablePageAsync(int pageNumber, int pageSize, RefAsync totalNumber) + { + if (this.Context.CurrentConnectionConfig.DbType != DbType.SqlServer) + { + this.QueryBuilder.Offset = "true"; + return await this.ToDataTablePageAsync(pageNumber, pageSize, totalNumber); + } + else + { + totalNumber.Value = await this.Clone().CountAsync(); + _ToOffsetPage(pageNumber, pageSize); + return await this.Clone().ToDataTableAsync(); + } + } + public async Task ToOffsetDataTableByEntityPageAsync(int pageNumber, int pageSize, RefAsync totalNumber) + { + return this.Context.Utilities.ListToDataTable(await ToOffsetPageAsync(pageNumber,pageSize,totalNumber)); + } + public async Task ToDataTableAsync() { QueryBuilder.ResultType = typeof(SugarCacheDataTable); diff --git a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs index d09acf6d0..97afb24aa 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs @@ -357,6 +357,13 @@ namespace SqlSugar var entityName = typeof(T).Name; return _As(tableName, entityName); } + + public ISugarQueryable IF(bool condition, Action> action) + { + if(condition) + action(this); + return this; + } public ISugarQueryable AsWithAttr() { var asName=GetTableName(this.EntityInfo, this.EntityInfo.DbTableName); @@ -1339,6 +1346,12 @@ namespace SqlSugar this._OrderBy(expression, type); return this; } + public virtual ISugarQueryable OrderBy(string expShortName, FormattableString expOrderBy, OrderByType type = OrderByType.Asc) + { + var exp = DynamicCoreHelper.GetMember(typeof(T), typeof(object), expShortName, expOrderBy); + this._OrderBy(exp, type); + return this; + } public virtual ISugarQueryable OrderByDescending(Expression> expression) { this._OrderBy(expression, OrderByType.Desc); @@ -1452,6 +1465,39 @@ namespace SqlSugar { return Select(expShortName, expSelect, resultType); } + public DynamicCoreSelectModel Select(string expShortName, List columns,params object[] args) + { + DynamicCoreSelectModel dynamicCoreSelectModel = new DynamicCoreSelectModel(); + if (!string.IsNullOrEmpty(this.QueryBuilder.TableShortName)&&expShortName!= this.QueryBuilder.TableShortName) + { + if (columns.Any(it => it .Contains( expShortName + " "))) + { + var pattern = $@"\b{Regex.Escape(expShortName)}\s*\."; // 匹配 expShortName 后面跟任意空格和点 + var replacement = this.QueryBuilder.TableShortName + "."; + + columns = columns.Select(it => Regex.Replace(it, pattern, replacement)).ToList(); + expShortName = this.QueryBuilder.TableShortName; + } + else + { + columns = columns.Select(it => it.Replace(expShortName + ".", this.QueryBuilder.TableShortName + ".")).ToList(); + expShortName = this.QueryBuilder.TableShortName; + } + } + var selectObj = DynamicCoreHelper.BuildPropertySelector( + expShortName, typeof(T), + columns, + args); + if (IsAppendNavColumns()) + { + SetAppendNavColumns(selectObj.Exp); + } + var exp = selectObj.Exp; + var method = GetType().GetMethod("_Select", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance) + .MakeGenericMethod(selectObj.ResultNewType); + dynamicCoreSelectModel.Value= method.Invoke(this, new object[] { exp }); + return dynamicCoreSelectModel; + } public virtual ISugarQueryable Select(Expression> expression) { if (IsAppendNavColumns()) diff --git a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider02-05.cs b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider02-05.cs index 64cd8c838..da2b13369 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider02-05.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider02-05.cs @@ -16,6 +16,10 @@ namespace SqlSugar #region T2 public partial class QueryableProvider : QueryableProvider, ISugarQueryable { + public new ISugarQueryable IF(bool condition, Action> action) + { + throw new Exception("Only Queryable().IF is supported, and Queryable().IF is not supported"); + } public new ISugarQueryable Hints(string hints) { this.QueryBuilder.Hints = hints; @@ -695,6 +699,10 @@ namespace SqlSugar #region T3 public partial class QueryableProvider : QueryableProvider, ISugarQueryable { + public new ISugarQueryable IF(bool condition, Action> action) + { + throw new Exception("Only Queryable().IF is supported, and Queryable().IF is not supported"); + } public new ISugarQueryable Hints(string hints) { this.QueryBuilder.Hints = hints; @@ -1480,6 +1488,10 @@ namespace SqlSugar #region T4 public partial class QueryableProvider : QueryableProvider, ISugarQueryable { + public new ISugarQueryable IF(bool condition, Action> action) + { + throw new Exception("Only Queryable().IF is supported, and Queryable().IF is not supported"); + } public new ISugarQueryable Hints(string hints) { this.QueryBuilder.Hints = hints; @@ -2286,6 +2298,10 @@ namespace SqlSugar #region T5 public partial class QueryableProvider : QueryableProvider, ISugarQueryable { + public new ISugarQueryable IF(bool condition, Action> action) + { + throw new Exception("Only Queryable().IF is supported, and Queryable().IF is not supported"); + } public new ISugarQueryable Hints(string hints) { this.QueryBuilder.Hints = hints; diff --git a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider06-10.cs b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider06-10.cs index aee971089..767cfb1bf 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider06-10.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider06-10.cs @@ -15,6 +15,10 @@ namespace SqlSugar #region T6 public partial class QueryableProvider : QueryableProvider, ISugarQueryable { + public new ISugarQueryable IF(bool condition, Action> action) + { + throw new Exception("Only Queryable().IF is supported, and Queryable().IF is not supported"); + } public new ISugarQueryable Hints(string hints) { this.QueryBuilder.Hints = hints; diff --git a/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarAccessory.cs b/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarAccessory.cs index f0ecb2c32..dd5b42234 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarAccessory.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarAccessory.cs @@ -557,6 +557,9 @@ namespace SqlSugar Check.Exception(SugarCompatible.IsFramework, "GaussDBNative only support .net core"); InstanceFactory.CustomDllName = "SqlSugar.GaussDBCore"; break; + case DbType.DuckDB: + InstanceFactory.CustomDllName = SugarCompatible.IsFramework ? throw new Exception("Only.NET CORE is supported") : "SqlSugar.DuckDBCore"; + break; default: throw new Exception("ConnectionConfig.DbType is null"); } diff --git a/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs index 7ecc9e13c..3cba5b4ba 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs @@ -1589,6 +1589,10 @@ namespace SqlSugar parameter.DbType = itemParameter.DbType; if (repeatCount>500||(isParameterNameRepeat&& repeatList.Any(it=>it.Key.EqualCase(itemParameter.ParameterName)))) { + if (newName.StartsWith(":") && itemSql.ToLower().Contains(itemParameter.ParameterName.ToLower().Replace(":", "@"))) + { + itemParameter.ParameterName = itemParameter.ParameterName.Replace(":", "@"); + } itemSql = UtilMethods.ReplaceSqlParameter(itemSql, itemParameter, newName); addParameters.Add(parameter); } @@ -1665,6 +1669,10 @@ namespace SqlSugar parameter.DbType = itemParameter.DbType; if (repeatCount>500||(isParameterNameRepeat&& repeatList.Any(it=>it.Key.EqualCase(itemParameter.ParameterName)))) { + if (newName.StartsWith(":") && itemSql.ToLower().Contains(itemParameter.ParameterName.ToLower().Replace(":", "@"))) + { + itemParameter.ParameterName = itemParameter.ParameterName.Replace(":", "@"); + } itemSql = UtilMethods.ReplaceSqlParameter(itemSql, itemParameter, newName); } else diff --git a/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/SplitTableUpdateByObjectProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/SplitTableUpdateByObjectProvider.cs index d9a54a5be..3db54cbcb 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/SplitTableUpdateByObjectProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/SplitTableUpdateByObjectProvider.cs @@ -24,6 +24,8 @@ namespace SqlSugar List groupModels; int result; GroupDataList(UpdateObjects, out groupModels, out result); + var dataEvent = this.Context.CurrentConnectionConfig.AopEvents?.DataExecuting; + this.Context.Aop.DataExecuting = null; foreach (var item in groupModels.GroupBy(it => it.GroupName)) { var addList = item.Select(it => it.Item).ToList(); @@ -46,7 +48,8 @@ namespace SqlSugar .IgnoreColumns(this.updateobj.UpdateBuilder.IsNoUpdateNull, this.updateobj.UpdateBuilder.IsOffIdentity, this.updateobj.UpdateBuilder.IsNoUpdateDefaultValue) .IgnoreColumns(GetIgnoreColumns()).AS(item.Key).ExecuteCommandWithOptLock(isThrowError); } - } + } + this.Context.Aop.DataExecuting = dataEvent; return result; } public int ExecuteCommand() @@ -57,12 +60,15 @@ namespace SqlSugar foreach (var item in groupModels.GroupBy(it => it.GroupName)) { var addList = item.Select(it => it.Item).ToList(); + var dataEvent = this.Context.CurrentConnectionConfig.AopEvents?.DataExecuting; + this.Context.Aop.DataExecuting = null; result += this.Context.Updateable(addList) .EnableDiffLogEventIF(this.IsEnableDiffLogEvent, this.BusinessData) .WhereColumns(this.WhereColumns?.ToArray()) .UpdateColumns(updateobj.UpdateBuilder.UpdateColumns?.ToArray()) .IgnoreColumns(this.updateobj.UpdateBuilder.IsNoUpdateNull, this.updateobj.UpdateBuilder.IsOffIdentity,this.updateobj.UpdateBuilder.IsNoUpdateDefaultValue) - .IgnoreColumns(GetIgnoreColumns()).AS(item.Key).ExecuteCommand(); + .IgnoreColumns(GetIgnoreColumns()).AS(item.Key).ExecuteCommand(); + this.Context.Aop.DataExecuting = dataEvent; } return result; } @@ -76,12 +82,15 @@ namespace SqlSugar foreach (var item in groupModels.GroupBy(it => it.GroupName)) { var addList = item.Select(it => it.Item).ToList(); + var dataEvent = this.Context.CurrentConnectionConfig.AopEvents?.DataExecuting; + this.Context.Aop.DataExecuting = null; result += await this.Context.Updateable(addList) .WhereColumns(this.WhereColumns?.ToArray()) .EnableDiffLogEventIF(this.IsEnableDiffLogEvent, this.BusinessData) .UpdateColumns(updateobj.UpdateBuilder.UpdateColumns?.ToArray()) .IgnoreColumns(this.updateobj.UpdateBuilder.IsNoUpdateNull, this.updateobj.UpdateBuilder.IsOffIdentity, this.updateobj.UpdateBuilder.IsNoUpdateDefaultValue) .IgnoreColumns(GetIgnoreColumns()).AS(item.Key).ExecuteCommandAsync(); + this.Context.Aop.DataExecuting = dataEvent; } return result; } @@ -90,6 +99,8 @@ namespace SqlSugar List groupModels; int result; GroupDataList(UpdateObjects, out groupModels, out result); + var dataEvent = this.Context.CurrentConnectionConfig.AopEvents?.DataExecuting; + this.Context.Aop.DataExecuting = null; foreach (var item in groupModels.GroupBy(it => it.GroupName)) { var addList = item.Select(it => it.Item).ToList(); @@ -113,7 +124,8 @@ namespace SqlSugar .IgnoreColumns(this.updateobj.UpdateBuilder.IsNoUpdateNull, this.updateobj.UpdateBuilder.IsOffIdentity, this.updateobj.UpdateBuilder.IsNoUpdateDefaultValue) .IgnoreColumns(GetIgnoreColumns()).AS(item.Key).ExecuteCommandWithOptLockAsync(isThrowError); } - } + } + this.Context.Aop.DataExecuting = dataEvent; return result; } private string [] GetIgnoreColumns() diff --git a/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateablePage.cs b/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateablePage.cs index b2fffe5f7..36293b046 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateablePage.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateablePage.cs @@ -16,6 +16,7 @@ namespace SqlSugar public DiffLogModel DiffModel { get; internal set; } public List UpdateColumns { get; internal set; } public string[] WhereColumnList { get; internal set; } + public Dictionary ReSetValueBySqlExpList { get; internal set; } public UpdateableFilter EnableQueryFilter() { @@ -47,7 +48,9 @@ namespace SqlSugar } this.Context.Utilities.PageEach(DataList, PageSize, pageItem => { - result += this.Context.Updateable(pageItem).AS(TableName).WhereColumns(WhereColumnList).EnableDiffLogEventIF(IsEnableDiffLogEvent, DiffModel).UpdateColumns(UpdateColumns.ToArray()).ExecuteCommand(); + var updateable = this.Context.Updateable(pageItem).AS(TableName); + updateable.UpdateBuilder.ReSetValueBySqlExpList = this.ReSetValueBySqlExpList; + result +=updateable.WhereColumns(WhereColumnList).EnableDiffLogEventIF(IsEnableDiffLogEvent, DiffModel).UpdateColumns(UpdateColumns.ToArray()).ExecuteCommand(); }); if (isNoTran) { @@ -81,7 +84,9 @@ namespace SqlSugar } await this.Context.Utilities.PageEachAsync(DataList, PageSize, async pageItem => { - result += await this.Context.Updateable(pageItem).AS(TableName).WhereColumns(WhereColumnList).EnableDiffLogEventIF(IsEnableDiffLogEvent, DiffModel).UpdateColumns(UpdateColumns.ToArray()).ExecuteCommandAsync(); + var updateable = this.Context.Updateable(pageItem); + updateable.UpdateBuilder.ReSetValueBySqlExpList = this.ReSetValueBySqlExpList; + result += await updateable.AS(TableName).WhereColumns(WhereColumnList).EnableDiffLogEventIF(IsEnableDiffLogEvent, DiffModel).UpdateColumns(UpdateColumns.ToArray()).ExecuteCommandAsync(); }); if (isNoTran) { diff --git a/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableProvider.cs index aebb2f978..874a22701 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableProvider.cs @@ -210,6 +210,7 @@ namespace SqlSugar result.IsEnableDiffLogEvent = this.IsEnableDiffLogEvent; result.WhereColumnList = this.WhereColumnList?.ToArray(); result.DiffModel = this.diffModel; + result.ReSetValueBySqlExpList = this.UpdateBuilder.ReSetValueBySqlExpList; if (this.UpdateBuilder.DbColumnInfoList.Any()) result.UpdateColumns = this.UpdateBuilder.DbColumnInfoList.GroupBy(it => it.TableId).First().Select(it => it.DbColumnName).ToList(); if(this.UpdateBuilder?.UpdateColumns?.Any()==true) diff --git a/Src/Asp.Net/SqlSugar/Entities/DynamicSelectModel.cs b/Src/Asp.Net/SqlSugar/Entities/DynamicSelectModel.cs new file mode 100644 index 000000000..a09b11519 --- /dev/null +++ b/Src/Asp.Net/SqlSugar/Entities/DynamicSelectModel.cs @@ -0,0 +1,190 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SqlSugar +{ + public class DynamicCoreSelectModel + { + public object Value { get; set; } + + public object ToList() + { + if (Value is null) + { + throw new InvalidOperationException("Value cannot be null."); + } + + var method = Value.GetType().GetMyMethod("ToList", 0); + if (method == null) + { + throw new InvalidOperationException("The Value object does not have a ToList method with no parameters."); + } + + return method.Invoke(Value, null); + } + + public async Task ToListAsync() + { + if (Value is null) + { + throw new InvalidOperationException("Value cannot be null."); + } + + var method = Value.GetType().GetMyMethod("ToListAsync", 0); + if (method == null) + { + throw new InvalidOperationException("The Value object does not have a ToListAsync method with no parameters."); + } + + var task = (Task)method.Invoke(Value, null); + return await GetTask(task).ConfigureAwait(false); + } + + public object ToPageList(int pageNumber, int pageSize) + { + if (Value is null) + { + throw new InvalidOperationException("Value cannot be null."); + } + + var method = Value.GetType().GetMyMethod("ToPageList", 2); + if (method == null) + { + throw new InvalidOperationException("The Value object does not have a ToPageList method with two parameters."); + } + + return method.Invoke(Value, new object[] { pageNumber, pageSize }); + } + + public async Task ToPageListAsync(int pageNumber, int pageSize) + { + if (Value is null) + { + throw new InvalidOperationException("Value cannot be null."); + } + + var method = Value.GetType().GetMyMethod("ToPageListAsync", 2); + if (method == null) + { + throw new InvalidOperationException("The Value object does not have a ToPageListAsync method with two parameters."); + } + + var task = (Task)method.Invoke(Value, new object[] { pageNumber, pageSize }); + return await GetTask(task).ConfigureAwait(false); + } + + public object ToPageList(int pageNumber, int pageSize, ref int totalNumber) + { + if (Value is null) + { + throw new InvalidOperationException("Value cannot be null."); + } + + var method = Value.GetType().GetMyMethod("ToPageList", 3); + if (method == null) + { + throw new InvalidOperationException("The Value object does not have a ToPageList method with three parameters."); + } + + var parameters = new object[] { pageNumber, pageSize, totalNumber }; + var result = method.Invoke(Value, parameters); + totalNumber = (int)parameters[2]; + return result; + } + + public async Task ToPageListAsync(int pageNumber, int pageSize,RefAsync totalNumber) + { + if (Value is null) + { + throw new InvalidOperationException("Value cannot be null."); + } + + var method = Value.GetType().GetMyMethod("ToPageListAsync", 3,typeof(int),typeof(int),typeof(RefAsync)); + if (method == null) + { + throw new InvalidOperationException("The Value object does not have a ToPageListAsync method with three parameters."); + } + + var parameters = new object[] { pageNumber, pageSize, totalNumber }; + var task = (Task)method.Invoke(Value, parameters); + var result = await GetTask(task).ConfigureAwait(false); + return result; + } + public object Single() + { + if (Value is null) + { + throw new InvalidOperationException("Value cannot be null."); + } + + var method = Value.GetType().GetMyMethod("Single", 0); + if (method == null) + { + throw new InvalidOperationException("The Value object does not have a Single method with no parameters."); + } + + return method.Invoke(Value, null); + } + public object First() + { + if (Value is null) + { + throw new InvalidOperationException("Value cannot be null."); + } + + var method = Value.GetType().GetMyMethod("First", 0); + if (method == null) + { + throw new InvalidOperationException("The Value object does not have a First method with no parameters."); + } + + return method.Invoke(Value, null); + } + + public async Task SingleAsync() + { + if (Value is null) + { + throw new InvalidOperationException("Value cannot be null."); + } + + var method = Value.GetType().GetMyMethod("SingleAsync", 0); + if (method == null) + { + throw new InvalidOperationException("The Value object does not have a SingleAsync method with no parameters."); + } + + var task = (Task)method.Invoke(Value, null); + return await GetTask(task).ConfigureAwait(false); + } + + public async Task FirstAsync() + { + if (Value is null) + { + throw new InvalidOperationException("Value cannot be null."); + } + + var method = Value.GetType().GetMyMethod("FirstAsync", 0); + if (method == null) + { + throw new InvalidOperationException("The Value object does not have a FirstAsync method with no parameters."); + } + + var task = (Task)method.Invoke(Value, null); + return await GetTask(task).ConfigureAwait(false); + } + + private static async Task GetTask(Task task) + { + await task.ConfigureAwait(false); // 等待任务完成 + var resultProperty = task.GetType().GetProperty("Result"); + var value = resultProperty.GetValue(task); + return value; + } + } +} diff --git a/Src/Asp.Net/SqlSugar/Enum/DbType.cs b/Src/Asp.Net/SqlSugar/Enum/DbType.cs index c2451a061..06f90f0e1 100644 --- a/Src/Asp.Net/SqlSugar/Enum/DbType.cs +++ b/Src/Asp.Net/SqlSugar/Enum/DbType.cs @@ -38,6 +38,7 @@ namespace SqlSugar HANA, DB2, GaussDBNative, + DuckDB, Custom =900 } } diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Common/SugarParameter.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Common/SugarParameter.cs index 220ed929a..4e7d29688 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Common/SugarParameter.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Common/SugarParameter.cs @@ -139,6 +139,14 @@ namespace SqlSugar { this.DbType = System.Data.DbType.Object; } + else if (type?.Namespace == "Kdbndp.LegacyPostgis") + { + this.DbType = System.Data.DbType.Object; + } + else if (type?.Namespace == "NetTopologySuite.Geometries") + { + this.DbType = System.Data.DbType.Object; + } else if (type!=null&&type.IsEnum()) { this.DbType = System.Data.DbType.Int64; diff --git a/Src/Asp.Net/SqlSugar/Infrastructure/ContextMethods.cs b/Src/Asp.Net/SqlSugar/Infrastructure/ContextMethods.cs index 7ebab26e3..b8f6ecb95 100644 --- a/Src/Asp.Net/SqlSugar/Infrastructure/ContextMethods.cs +++ b/Src/Asp.Net/SqlSugar/Infrastructure/ContextMethods.cs @@ -262,7 +262,8 @@ namespace SqlSugar using (reader) { var tType = typeof(T); - var classProperties = tType.GetProperties().ToList(); + var classProperties = tType.GetProperties() + .Where(p => p.GetIndexParameters().Length == 0).ToList(); var reval = new List(); if (reader != null && !reader.IsClosed) { @@ -331,7 +332,8 @@ namespace SqlSugar public List DataReaderToListNoUsing(IDataReader reader) { var tType = typeof(T); - var classProperties = tType.GetProperties().ToList(); + var classProperties = tType.GetProperties() + .Where(p => p.GetIndexParameters().Length == 0).ToList(); var reval = new List(); if (reader != null && !reader.IsClosed) { @@ -356,7 +358,7 @@ namespace SqlSugar using (reader) { var tType = typeof(T); - var classProperties = tType.GetProperties().ToList(); + var classProperties = tType.GetProperties().Where(p => p.GetIndexParameters().Length == 0).ToList(); var reval = new List(); if (reader != null && !reader.IsClosed) { @@ -423,7 +425,7 @@ namespace SqlSugar public async Task> DataReaderToListAsyncNoUsing(IDataReader reader) { var tType = typeof(T); - var classProperties = tType.GetProperties().ToList(); + var classProperties = tType.GetProperties().Where(p => p.GetIndexParameters().Length == 0).ToList(); var reval = new List(); if (reader != null && !reader.IsClosed) { diff --git a/Src/Asp.Net/SqlSugar/Interface/IFastest.cs b/Src/Asp.Net/SqlSugar/Interface/IFastest.cs index 7e969996d..3c7d2ce6c 100644 --- a/Src/Asp.Net/SqlSugar/Interface/IFastest.cs +++ b/Src/Asp.Net/SqlSugar/Interface/IFastest.cs @@ -38,6 +38,8 @@ namespace SqlSugar int BulkMerge(List datas); int BulkMerge(DataTable dataTable, string[] whereColumns,bool isIdentity); Task BulkMergeAsync(DataTable dataTable, string[] whereColumns, bool isIdentity); + int BulkMerge(DataTable dataTable, string[] whereColumns,string[] updateColumns, bool isIdentity); + Task BulkMergeAsync(DataTable dataTable, string[] whereColumns, string[] updateColumns, bool isIdentity); Task BulkMergeAsync(List datas, string[] whereColumns); int BulkMerge(List datas, string[] whereColumns); Task BulkMergeAsync(List datas, string[] whereColumns, string[] updateColumns); diff --git a/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs b/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs index 8596aa1a6..7d45895f9 100644 --- a/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs +++ b/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs @@ -20,6 +20,7 @@ namespace SqlSugar ISugarQueryable Hints(string hints); ISugarQueryable AS(string tableName); ISugarQueryable AS(string tableName); + ISugarQueryable IF(bool condition, Action> action); ISugarQueryable AsWithAttr(); ISugarQueryable AsType(Type tableNameType); ISugarQueryable Cast(); @@ -118,6 +119,7 @@ namespace SqlSugar ISugarQueryable OrderByPropertyName(string orderPropertyName,OrderByType? orderByType=null); ISugarQueryable OrderByPropertyNameIF(bool isOrderBy,string orderPropertyName, OrderByType? orderByType = null); ISugarQueryable OrderBy(Expression> expression, OrderByType type = OrderByType.Asc); + ISugarQueryable OrderBy(string expShortName, FormattableString expOrderBy, OrderByType type = OrderByType.Asc); ISugarQueryable OrderByDescending(Expression> expression); ISugarQueryable OrderByIF(bool isOrderBy, string orderByFields); ISugarQueryable OrderByIF(bool isOrderBy, Expression> expression, OrderByType type = OrderByType.Asc); @@ -269,6 +271,16 @@ namespace SqlSugar Task ToDataTablePageAsync(int pageNumber, int pageSize, RefAsync totalNumber); Task ToDataTableByEntityPageAsync(int pageNumber, int pageSize, RefAsync totalNumber); + + DataTable ToOffsetDataTablePage(int pageNumber, int pageSize); + Task ToOffsetDataTablePageAsync(int pageNumber, int pageSize); + DataTable ToOffsetDataTablePage(int pageNumber, int pageSize, ref int totalNumber); + DataTable ToOffsetDataTableByEntityPage(int pageNumber, int pageSize, ref int totalNumber); + DataTable ToOffsetDataTablePage(int pageNumber, int pageSize, ref int totalNumber, ref int totalPage); + Task ToOffsetDataTablePageAsync(int pageNumber, int pageSize, RefAsync totalNumber); + Task ToOffsetDataTableByEntityPageAsync(int pageNumber, int pageSize, RefAsync totalNumber); + + List ToOffsetPage(int pageNumber, int pageSize); List ToOffsetPage(int pageNumber, int pageSize,ref int totalNumber); List ToOffsetPage(int pageNumber, int pageSize, ref int totalNumber,ref int totalPage); @@ -321,6 +333,7 @@ namespace SqlSugar } public partial interface ISugarQueryable : ISugarQueryable { + new ISugarQueryable IF(bool condition, Action> action); new ISugarQueryable Hints(string hints); new ISugarQueryable SampleBy(int timeNumber, SampleByUnit timeType); new ISugarQueryable SampleBy(int timeNumber, string timeType); @@ -451,6 +464,7 @@ namespace SqlSugar } public partial interface ISugarQueryable : ISugarQueryable { + new ISugarQueryable IF(bool condition, Action> action); new ISugarQueryable Hints(string hints); new ISugarQueryable SampleBy(int timeNumber, SampleByUnit timeType); new ISugarQueryable SampleBy(int timeNumber, string timeType); @@ -596,6 +610,7 @@ namespace SqlSugar } public partial interface ISugarQueryable : ISugarQueryable { + new ISugarQueryable IF(bool condition, Action> action); new ISugarQueryable Hints(string hints); new ISugarQueryable SampleBy(int timeNumber, SampleByUnit timeType); new ISugarQueryable SampleBy(int timeNumber, string timeType); @@ -747,6 +762,7 @@ namespace SqlSugar } public partial interface ISugarQueryable : ISugarQueryable { + new ISugarQueryable IF(bool condition, Action> action); new ISugarQueryable Hints(string hints); new ISugarQueryable SampleBy(int timeNumber, SampleByUnit timeType); new ISugarQueryable SampleBy(int timeNumber, string timeType); @@ -893,6 +909,7 @@ namespace SqlSugar } public partial interface ISugarQueryable : ISugarQueryable { + new ISugarQueryable IF(bool condition, Action> action); new ISugarQueryable Hints(string hints); ISugarQueryable SelectMergeTable(Expression> expression); ISugarQueryable LeftJoinIF(bool isLeftJoin, Expression> joinExpression); diff --git a/Src/Asp.Net/SqlSugar/Json2Sql/DynamicLinq/DynamicCoreHelper.cs b/Src/Asp.Net/SqlSugar/Json2Sql/DynamicLinq/DynamicCoreHelper.cs index 9b2d60750..8f7ce460b 100644 --- a/Src/Asp.Net/SqlSugar/Json2Sql/DynamicLinq/DynamicCoreHelper.cs +++ b/Src/Asp.Net/SqlSugar/Json2Sql/DynamicLinq/DynamicCoreHelper.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; +using System.Runtime.CompilerServices; using System.Text; using System.Text.RegularExpressions; @@ -9,6 +10,35 @@ namespace SqlSugar { public class DynamicCoreHelper { + public static BuildPropertySelectorResult BuildPropertySelector(string shortName, Type type, List propertyNames, params object[] args) + { + BuildPropertySelectorResult result = new BuildPropertySelectorResult(); + if (type == null) + throw new ArgumentNullException(nameof(type)); + + if (propertyNames == null || propertyNames.Count == 0) + throw new ArgumentNullException(nameof(propertyNames)); + + var parameter = Expression.Parameter(type, shortName); + + // 解析多个属性,生成匿名类型 + var newAnonymousTypeStr = $"new {{ {string.Join(", ", propertyNames)} }}"; + newAnonymousTypeStr = ReplaceFormatParameters(newAnonymousTypeStr); + result.formattableString = FormattableStringFactory.Create(newAnonymousTypeStr, args); + var lambda = SqlSugarDynamicExpressionParser.ParseLambda(new[] { parameter }, null, newAnonymousTypeStr, args); + result.ResultNewType = lambda.Body.Type; + result.ShortName = shortName; + result.Exp = lambda; + return result; + } + + public class BuildPropertySelectorResult + { + public FormattableString formattableString { get; set; } + public string ShortName { get; set; } + public Type ResultNewType { get; set; } + public LambdaExpression Exp { get; internal set; } + } public static Expression> GetWhere(string shortName, FormattableString whereSql) { return (Expression>)GetWhere(typeof(T), shortName, whereSql); @@ -113,7 +143,7 @@ namespace SqlSugar } public static LambdaExpression GetMember(Type entityType,Type propertyType, string shortName, FormattableString memberSql) { - var parameter = Expression.Parameter(entityType, "it"); + var parameter = Expression.Parameter(entityType, shortName); // 提取 FormattableString 中的参数值 var arguments = memberSql.GetArguments(); diff --git a/Src/Asp.Net/SqlSugar/Json2Sql/Interface/ISugarQueryable.cs b/Src/Asp.Net/SqlSugar/Json2Sql/Interface/ISugarQueryable.cs index 669dab479..e56eadd37 100644 --- a/Src/Asp.Net/SqlSugar/Json2Sql/Interface/ISugarQueryable.cs +++ b/Src/Asp.Net/SqlSugar/Json2Sql/Interface/ISugarQueryable.cs @@ -9,6 +9,7 @@ namespace SqlSugar ISugarQueryable Having(IFuncModel model); ISugarQueryable OrderBy(List models); ISugarQueryable GroupBy(List models); + DynamicCoreSelectModel Select(string expShortName, List columns, params object[] args); ISugarQueryable Select(List models); ISugarQueryable Select(List models); ISugarQueryable Select(List models,AsNameFormatType type); diff --git a/Src/Asp.Net/SqlSugar/SqlSugar.csproj b/Src/Asp.Net/SqlSugar/SqlSugar.csproj index 503b1524d..c1ccda412 100644 --- a/Src/Asp.Net/SqlSugar/SqlSugar.csproj +++ b/Src/Asp.Net/SqlSugar/SqlSugar.csproj @@ -166,6 +166,7 @@ + diff --git a/Src/Asp.Net/SqlSugar/Utilities/ExpressionBuilderHelper.cs b/Src/Asp.Net/SqlSugar/Utilities/ExpressionBuilderHelper.cs index f3a5e59de..ad936ed40 100644 --- a/Src/Asp.Net/SqlSugar/Utilities/ExpressionBuilderHelper.cs +++ b/Src/Asp.Net/SqlSugar/Utilities/ExpressionBuilderHelper.cs @@ -95,9 +95,9 @@ namespace SqlSugar Expression.New(dynamicType.GetConstructor(Type.EmptyTypes)), bindings), sourceItem); } } - public static Expression CreateExpressionSelectField(Type classType, string propertyName, Type propertyType) + public static Expression CreateExpressionSelectField(Type classType, string propertyName, Type propertyType,string shortName="it") { - ParameterExpression parameter = Expression.Parameter(classType, "it"); + ParameterExpression parameter = Expression.Parameter(classType, shortName); // 创建属性表达式 PropertyInfo propertyInfo = classType.GetProperty(propertyName); diff --git a/Src/Asp.Net/SqlSugar/Utilities/UtilMethods.cs b/Src/Asp.Net/SqlSugar/Utilities/UtilMethods.cs index c51f6b4a7..f6c0ef402 100644 --- a/Src/Asp.Net/SqlSugar/Utilities/UtilMethods.cs +++ b/Src/Asp.Net/SqlSugar/Utilities/UtilMethods.cs @@ -610,6 +610,14 @@ namespace SqlSugar { return (char)(bytes)[0]; } + else if (value is DateTime && destinationType == typeof(TimeSpan)) + { + value = Convert.ToDateTime(value).TimeOfDay; + } + else if (value is DateTime && destinationType.FullName == "System.TimeOnly") + { + value = Convert.ToDateTime(value).TimeOfDay; + } var destinationConverter = TypeDescriptor.GetConverter(destinationType); if (destinationConverter != null && destinationConverter.CanConvertFrom(value.GetType())) return destinationConverter.ConvertFrom(null, culture, value);