Synchronous code

This commit is contained in:
sunkaixuan 2025-04-20 19:23:22 +08:00
parent 8526e772eb
commit 77a9e5337f
28 changed files with 518 additions and 21 deletions

View File

@ -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)))

View File

@ -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<DbColumnInfo> dbColumn = new List<DbColumnInfo>();
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
{

View File

@ -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;
}

View File

@ -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))
{

View File

@ -198,6 +198,18 @@ namespace SqlSugar
var result = (Task<int>)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<int> 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<int>)bulkCopyMethod.Invoke(fastestMethod, new object[] { newValue,whereColumns,updateColumns });
return result;
}
public Task<int> BulkMergeAsync(List<T> 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<int> _BulkUpdate(List<T> datas, string[] whereColumns, string[] updateColumns)
{

View File

@ -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);

View File

@ -164,7 +164,12 @@ namespace SqlSugar
this.QueryableObj = method.Invoke(QueryableObj, new object[] { });
return this;
}
public QueryMethodInfo Select(string expShortName, List<string> columns, params object[] args)
{
var method = QueryableObj.GetType().GetMyMethod("Select", 3, typeof(string), typeof(List<string>), typeof(object[]));
this.QueryableObj = method.Invoke(QueryableObj, new object[] { expShortName,columns,args });
return this;
}
public QueryMethodInfo Select(List<SelectModel> models)
{
var method = QueryableObj.GetType().GetMyMethod("Select", 1, typeof(List<SelectModel>));

View File

@ -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);

View File

@ -355,6 +355,39 @@ namespace SqlSugar
var list =await this.ToListAsync();
return this.Context.Utilities.ListToDataTable(list);
}
public Task<DataTable> 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<DataTable> ToOffsetDataTablePageAsync(int pageNumber, int pageSize, RefAsync<int> 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<DataTable> ToOffsetDataTableByEntityPageAsync(int pageNumber, int pageSize, RefAsync<int> totalNumber)
{
return this.Context.Utilities.ListToDataTable(await ToOffsetPageAsync(pageNumber,pageSize,totalNumber));
}
public async Task<DataTable> ToDataTableAsync()
{
QueryBuilder.ResultType = typeof(SugarCacheDataTable);

View File

@ -357,6 +357,13 @@ namespace SqlSugar
var entityName = typeof(T).Name;
return _As(tableName, entityName);
}
public ISugarQueryable<T> IF(bool condition, Action<ISugarQueryable<T>> action)
{
if(condition)
action(this);
return this;
}
public ISugarQueryable<T> AsWithAttr()
{
var asName=GetTableName(this.EntityInfo, this.EntityInfo.DbTableName);
@ -1339,6 +1346,12 @@ namespace SqlSugar
this._OrderBy(expression, type);
return this;
}
public virtual ISugarQueryable<T> 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<T> OrderByDescending(Expression<Func<T, object>> expression)
{
this._OrderBy(expression, OrderByType.Desc);
@ -1452,6 +1465,39 @@ namespace SqlSugar
{
return Select<T>(expShortName, expSelect, resultType);
}
public DynamicCoreSelectModel Select(string expShortName, List<string> 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<TResult> Select<TResult>(Expression<Func<T, TResult>> expression)
{
if (IsAppendNavColumns())

View File

@ -16,6 +16,10 @@ namespace SqlSugar
#region T2
public partial class QueryableProvider<T, T2> : QueryableProvider<T>, ISugarQueryable<T, T2>
{
public new ISugarQueryable<T, T2> IF(bool condition, Action<ISugarQueryable<T>> action)
{
throw new Exception("Only Queryable<T>().IF is supported, and Queryable<T,T2,>().IF is not supported");
}
public new ISugarQueryable<T,T2> Hints(string hints)
{
this.QueryBuilder.Hints = hints;
@ -695,6 +699,10 @@ namespace SqlSugar
#region T3
public partial class QueryableProvider<T, T2, T3> : QueryableProvider<T>, ISugarQueryable<T, T2, T3>
{
public new ISugarQueryable<T, T2,T3> IF(bool condition, Action<ISugarQueryable<T>> action)
{
throw new Exception("Only Queryable<T>().IF is supported, and Queryable<T,T2,>().IF is not supported");
}
public new ISugarQueryable<T, T2,T3> Hints(string hints)
{
this.QueryBuilder.Hints = hints;
@ -1480,6 +1488,10 @@ namespace SqlSugar
#region T4
public partial class QueryableProvider<T, T2, T3, T4> : QueryableProvider<T>, ISugarQueryable<T, T2, T3, T4>
{
public new ISugarQueryable<T, T2,T3,T4> IF(bool condition, Action<ISugarQueryable<T>> action)
{
throw new Exception("Only Queryable<T>().IF is supported, and Queryable<T,T2,>().IF is not supported");
}
public new ISugarQueryable<T, T2, T3,T4> Hints(string hints)
{
this.QueryBuilder.Hints = hints;
@ -2286,6 +2298,10 @@ namespace SqlSugar
#region T5
public partial class QueryableProvider<T, T2, T3, T4, T5> : QueryableProvider<T>, ISugarQueryable<T, T2, T3, T4, T5>
{
public new ISugarQueryable<T, T2,T3,T4,T5> IF(bool condition, Action<ISugarQueryable<T>> action)
{
throw new Exception("Only Queryable<T>().IF is supported, and Queryable<T,T2,>().IF is not supported");
}
public new ISugarQueryable<T, T2, T3, T4,T5> Hints(string hints)
{
this.QueryBuilder.Hints = hints;

View File

@ -15,6 +15,10 @@ namespace SqlSugar
#region T6
public partial class QueryableProvider<T, T2, T3, T4, T5, T6> : QueryableProvider<T>, ISugarQueryable<T, T2, T3, T4, T5, T6>
{
public new ISugarQueryable<T, T2, T3, T4, T5, T6> IF(bool condition, Action<ISugarQueryable<T>> action)
{
throw new Exception("Only Queryable<T>().IF is supported, and Queryable<T,T2,>().IF is not supported");
}
public new ISugarQueryable<T, T2, T3, T4, T5,T6> Hints(string hints)
{
this.QueryBuilder.Hints = hints;

View File

@ -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");
}

View File

@ -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

View File

@ -24,6 +24,8 @@ namespace SqlSugar
List<GroupModel> 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<GroupModel> 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()

View File

@ -16,6 +16,7 @@ namespace SqlSugar
public DiffLogModel DiffModel { get; internal set; }
public List<string> UpdateColumns { get; internal set; }
public string[] WhereColumnList { get; internal set; }
public Dictionary<string, ReSetValueBySqlExpListModel> ReSetValueBySqlExpList { get; internal set; }
public UpdateableFilter<T> 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)
{

View File

@ -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)

View File

@ -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<object> 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<object> 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<object> ToPageListAsync(int pageNumber, int pageSize,RefAsync<int> 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<int>));
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<object> 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<object> 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<object> GetTask(Task task)
{
await task.ConfigureAwait(false); // 等待任务完成
var resultProperty = task.GetType().GetProperty("Result");
var value = resultProperty.GetValue(task);
return value;
}
}
}

View File

@ -38,6 +38,7 @@ namespace SqlSugar
HANA,
DB2,
GaussDBNative,
DuckDB,
Custom =900
}
}

View File

@ -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;

View File

@ -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<T>();
if (reader != null && !reader.IsClosed)
{
@ -331,7 +332,8 @@ namespace SqlSugar
public List<T> DataReaderToListNoUsing<T>(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<T>();
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<T>();
if (reader != null && !reader.IsClosed)
{
@ -423,7 +425,7 @@ namespace SqlSugar
public async Task<List<T>> DataReaderToListAsyncNoUsing<T>(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<T>();
if (reader != null && !reader.IsClosed)
{

View File

@ -38,6 +38,8 @@ namespace SqlSugar
int BulkMerge(List<T> datas);
int BulkMerge(DataTable dataTable, string[] whereColumns,bool isIdentity);
Task<int> BulkMergeAsync(DataTable dataTable, string[] whereColumns, bool isIdentity);
int BulkMerge(DataTable dataTable, string[] whereColumns,string[] updateColumns, bool isIdentity);
Task<int> BulkMergeAsync(DataTable dataTable, string[] whereColumns, string[] updateColumns, bool isIdentity);
Task<int> BulkMergeAsync(List<T> datas, string[] whereColumns);
int BulkMerge(List<T> datas, string[] whereColumns);
Task<int> BulkMergeAsync(List<T> datas, string[] whereColumns, string[] updateColumns);

View File

@ -20,6 +20,7 @@ namespace SqlSugar
ISugarQueryable<T> Hints(string hints);
ISugarQueryable<T> AS<T2>(string tableName);
ISugarQueryable<T> AS(string tableName);
ISugarQueryable<T> IF(bool condition, Action<ISugarQueryable<T>> action);
ISugarQueryable<T> AsWithAttr();
ISugarQueryable<T> AsType(Type tableNameType);
ISugarQueryable<Type> Cast<Type>();
@ -118,6 +119,7 @@ namespace SqlSugar
ISugarQueryable<T> OrderByPropertyName(string orderPropertyName,OrderByType? orderByType=null);
ISugarQueryable<T> OrderByPropertyNameIF(bool isOrderBy,string orderPropertyName, OrderByType? orderByType = null);
ISugarQueryable<T> OrderBy(Expression<Func<T, object>> expression, OrderByType type = OrderByType.Asc);
ISugarQueryable<T> OrderBy(string expShortName, FormattableString expOrderBy, OrderByType type = OrderByType.Asc);
ISugarQueryable<T> OrderByDescending(Expression<Func<T, object>> expression);
ISugarQueryable<T> OrderByIF(bool isOrderBy, string orderByFields);
ISugarQueryable<T> OrderByIF(bool isOrderBy, Expression<Func<T, object>> expression, OrderByType type = OrderByType.Asc);
@ -269,6 +271,16 @@ namespace SqlSugar
Task<DataTable> ToDataTablePageAsync(int pageNumber, int pageSize, RefAsync<int> totalNumber);
Task<DataTable> ToDataTableByEntityPageAsync(int pageNumber, int pageSize, RefAsync<int> totalNumber);
DataTable ToOffsetDataTablePage(int pageNumber, int pageSize);
Task<DataTable> 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<DataTable> ToOffsetDataTablePageAsync(int pageNumber, int pageSize, RefAsync<int> totalNumber);
Task<DataTable> ToOffsetDataTableByEntityPageAsync(int pageNumber, int pageSize, RefAsync<int> totalNumber);
List<T> ToOffsetPage(int pageNumber, int pageSize);
List<T> ToOffsetPage(int pageNumber, int pageSize,ref int totalNumber);
List<T> ToOffsetPage(int pageNumber, int pageSize, ref int totalNumber,ref int totalPage);
@ -321,6 +333,7 @@ namespace SqlSugar
}
public partial interface ISugarQueryable<T, T2> : ISugarQueryable<T>
{
new ISugarQueryable<T,T2> IF(bool condition, Action<ISugarQueryable<T>> action);
new ISugarQueryable<T,T2> Hints(string hints);
new ISugarQueryable<T,T2> SampleBy(int timeNumber, SampleByUnit timeType);
new ISugarQueryable<T,T2> SampleBy(int timeNumber, string timeType);
@ -451,6 +464,7 @@ namespace SqlSugar
}
public partial interface ISugarQueryable<T, T2, T3> : ISugarQueryable<T>
{
new ISugarQueryable<T, T2,T3> IF(bool condition, Action<ISugarQueryable<T>> action);
new ISugarQueryable<T, T2,T3> Hints(string hints);
new ISugarQueryable<T, T2,T3> SampleBy(int timeNumber, SampleByUnit timeType);
new ISugarQueryable<T, T2,T3> SampleBy(int timeNumber, string timeType);
@ -596,6 +610,7 @@ namespace SqlSugar
}
public partial interface ISugarQueryable<T, T2, T3, T4> : ISugarQueryable<T>
{
new ISugarQueryable<T, T2,T3,T4> IF(bool condition, Action<ISugarQueryable<T>> action);
new ISugarQueryable<T, T2, T3,T4> Hints(string hints);
new ISugarQueryable<T, T2, T3,T4> SampleBy(int timeNumber, SampleByUnit timeType);
new ISugarQueryable<T, T2, T3,T4> SampleBy(int timeNumber, string timeType);
@ -747,6 +762,7 @@ namespace SqlSugar
}
public partial interface ISugarQueryable<T, T2, T3, T4, T5> : ISugarQueryable<T>
{
new ISugarQueryable<T, T2,T3,T4,T5> IF(bool condition, Action<ISugarQueryable<T>> action);
new ISugarQueryable<T, T2, T3, T4,T5> Hints(string hints);
new ISugarQueryable<T, T2, T3, T4,T5> SampleBy(int timeNumber, SampleByUnit timeType);
new ISugarQueryable<T, T2, T3, T4,T5> SampleBy(int timeNumber, string timeType);
@ -893,6 +909,7 @@ namespace SqlSugar
}
public partial interface ISugarQueryable<T, T2, T3, T4, T5, T6> : ISugarQueryable<T>
{
new ISugarQueryable<T, T2, T3, T4, T5, T6> IF(bool condition, Action<ISugarQueryable<T>> action);
new ISugarQueryable<T, T2, T3, T4, T5,T6> Hints(string hints);
ISugarQueryable<TResult> SelectMergeTable<TResult>(Expression<Func<T, T2, T3, T4, T5,T6, TResult>> expression);
ISugarQueryable<T, T2, T3, T4, T5, T6,T7> LeftJoinIF<T7>(bool isLeftJoin, Expression<Func<T, T2, T3, T4, T5, T6,T7, bool>> joinExpression);

View File

@ -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<string> 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<Func<T, bool>> GetWhere<T>(string shortName, FormattableString whereSql)
{
return (Expression<Func<T, bool>>)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();

View File

@ -9,6 +9,7 @@ namespace SqlSugar
ISugarQueryable<T> Having(IFuncModel model);
ISugarQueryable<T> OrderBy(List<OrderByModel> models);
ISugarQueryable<T> GroupBy(List<GroupByModel> models);
DynamicCoreSelectModel Select(string expShortName, List<string> columns, params object[] args);
ISugarQueryable<T> Select(List<SelectModel> models);
ISugarQueryable<TResult> Select<TResult>(List<SelectModel> models);
ISugarQueryable<T> Select(List<SelectModel> models,AsNameFormatType type);

View File

@ -166,6 +166,7 @@
<Compile Include="Abstract\UpdateProvider\SplitTableUpdateByObjectProvider.cs" />
<Compile Include="Abstract\UpdateProvider\UpdateNavMethodInfo.cs" />
<Compile Include="Entities\DiscriminatorObject .cs" />
<Compile Include="Entities\DynamicSelectModel.cs" />
<Compile Include="Entities\NavigationInitializer.cs" />
<Compile Include="Entities\PropertyMetadata.cs" />
<Compile Include="Entities\DbFastestProperties.cs" />

View File

@ -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);

View File

@ -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);