mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2025-04-24 18:04:52 +08:00
Synchronous code
This commit is contained in:
parent
8526e772eb
commit
77a9e5337f
@ -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)))
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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))
|
||||
{
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
@ -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>));
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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())
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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");
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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()
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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)
|
||||
|
190
Src/Asp.Net/SqlSugar/Entities/DynamicSelectModel.cs
Normal file
190
Src/Asp.Net/SqlSugar/Entities/DynamicSelectModel.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
@ -38,6 +38,7 @@ namespace SqlSugar
|
||||
HANA,
|
||||
DB2,
|
||||
GaussDBNative,
|
||||
DuckDB,
|
||||
Custom =900
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
|
@ -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" />
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user