Synchronous code

This commit is contained in:
sunkaixuan 2025-06-03 20:03:23 +08:00
parent 03bf65e647
commit 8b8b7f6127
28 changed files with 378 additions and 16 deletions

View File

@ -46,7 +46,8 @@ namespace SqlSugar
/// <summary>
/// Add, delete and modify: the number of affected items;
/// </summary>
public int SqlExecuteCount { get; private set; } = 0;
public int SqlExecuteCount { get; protected set; } = 0;
public SugarActionType SqlExecuteType { get=> this.Context.SugarActionType;}
public StackTraceInfo SqlStackTrace { get { return UtilMethods.GetStackTrace(); } }
public bool IsDisableMasterSlaveSeparation { get; set; }
internal DateTime BeforeTime = DateTime.MinValue;
@ -1726,6 +1727,9 @@ namespace SqlSugar
}
protected void InitParameters(ref string sql, SugarParameter[] parameters)
{
this.SqlExecuteCount = 0;
this.BeforeTime = DateTime.MinValue;
this.AfterTime = DateTime.MinValue;
if (parameters.HasValue())
{
foreach (var item in parameters)

View File

@ -246,7 +246,7 @@ namespace SqlSugar
{
indexName = this.SqlBuilder.GetNoTranslationColumnName(indexName);
tableName= this.SqlBuilder.GetNoTranslationColumnName(tableName);
this.Context.Ado.ExecuteCommand($" DROP INDEX {indexName} ON {tableName}");
this.Context.Ado.ExecuteCommand($" DROP INDEX {indexName} ");
return true;
}
public virtual bool DropView(string viewName)

View File

@ -61,6 +61,10 @@ namespace SqlSugar
{
if (Size > 0)
{
if (this.GetBuider()?.DbFastestProperties?.NoPage == true)
{
Size = int.MaxValue;
}
int resul=0;
await this.context.Utilities.PageEachAsync(datas, Size, async item =>
{

View File

@ -226,6 +226,10 @@ namespace SqlSugar
private DataTable GetCopyWriteDataTable(DataTable dt)
{
var builder = GetBuider();
if (builder.DbFastestProperties?.IsConvertDateTimeOffsetToDateTime == true)
{
dt = UtilMethods.ConvertDateTimeOffsetToDateTime(dt);
}
if (builder.DbFastestProperties?.IsNoCopyDataTable == true)
{
return dt;

View File

@ -9,6 +9,7 @@ namespace SqlSugar
internal class SqlInfo
{
public bool IsSelectNav { get; set; }
public int? Take { get; set; }
public int? Skip { get; set; }
public string WhereString { get; set; }

View File

@ -856,6 +856,18 @@ namespace SqlSugar
{
var pkInfo = entityInfo.Columns.FirstOrDefault(x => x.IsPrimarykey);
result.SelectString = (" " + queryable.QueryBuilder.GetExpressionValue(exp, ResolveExpressType.SelectSingle).GetString());
if (ExpressionTool.ContainsTwoLevelAccess(exp))
{
var shortName = ExpressionTool.GetParameters(exp).FirstOrDefault()?.Name;
if (shortName.HasValue())
{
if (result.TableShortName == null)
{
result.TableShortName = shortName;
result.IsSelectNav = true;
}
}
}
if (pkInfo != null)
{
var pkName = pkInfo.DbColumnName;
@ -941,6 +953,13 @@ namespace SqlSugar
private static void AppColumns(SqlInfo result, ISugarQueryable<object> queryable, string columnName)
{
var selectPkName = queryable.SqlBuilder.GetTranslationColumnName(columnName);
if (result.IsSelectNav)
{
if (result.SelectString != null && !result.SelectString.ToLower().Contains($" {selectPkName.ToLower()} AS {selectPkName.ToLower()}"))
{
result.SelectString = result.SelectString + "," + (selectPkName + " AS " + selectPkName);
}
}
if (result.SelectString!=null && !result.SelectString.ToLower().Contains(selectPkName.ToLower()))
{
result.SelectString = result.SelectString + "," + (selectPkName +" AS "+ selectPkName);

View File

@ -1781,6 +1781,7 @@ namespace SqlSugar
var unionall = this.Context._UnionAll(tableQueryables.ToArray());
unionall.QueryBuilder.Includes = this.QueryBuilder.Includes;
unionall.QueryBuilder.EntityType = typeof(T);
unionall.QueryBuilder.IsDisableMasterSlaveSeparation = this.QueryBuilder.IsDisableMasterSlaveSeparation;
unionall.QueryBuilder.IsDisabledGobalFilter = this.QueryBuilder.IsDisabledGobalFilter;
if (unionall.QueryBuilder.Includes?.Any()==true)
{

View File

@ -1109,6 +1109,7 @@ namespace SqlSugar
public virtual bool IsSelectNoAll { get; set; } = false;
public List<string> AutoAppendedColumns { get; set; }
public Dictionary<string, string> MappingKeys { get; set; }
public List<KeyValuePair<string,string>> SelectNewIgnoreColumns { get; set; }
#endregion
private string GetTableName(string entityName)

View File

@ -177,6 +177,7 @@ namespace SqlSugar
builder.Replace(" ( AND ", " ( ");
builder.Replace(" ( OR ", " ( ");
builder.Replace(" OR AND ", " OR ");
builder.Replace(" AND AND ", " AND ");
}
}
parameters.AddRange(childSqlInfo.Value);

View File

@ -13,5 +13,7 @@ namespace SqlSugar
public bool IsOffIdentity { get; set; }
public bool IsMerge { get; set; }
public bool IsNoCopyDataTable { get; set; }
public bool IsConvertDateTimeOffsetToDateTime { get; set; }
public bool NoPage { get; set; }
}
}

View File

@ -10,6 +10,32 @@ namespace SqlSugar
{
public class ExpressionTool
{
public static bool ContainsTwoLevelAccess(Expression exp)
{
var result = false;
if (exp is LambdaExpression lambda &&
lambda.Body is MemberInitExpression initExpr)
{
var param = lambda.Parameters[0];
foreach (var binding in initExpr.Bindings)
{
if (binding is MemberAssignment assign)
{
if (assign.Expression is MemberExpression outer &&
outer.Expression is MemberExpression inner &&
inner.Expression == param)
{
result = true;
break; // 已经找到了,就退出循环
}
}
}
}
return result;
}
public static string GetMemberNameByMethod(Expression expression, string name)
{

View File

@ -11,6 +11,7 @@ namespace SqlSugar
public List<MethodCallExpressionArgs> Args { get; set; }
public string Name { get; set; }
public dynamic Data { get; set; }
public object DataObject { get; set; }
public Expression Expression { get; set; }
public Expression BaseExpression { get; set; }
public List<SugarParameter> Parameters { get; set; }

View File

@ -946,6 +946,20 @@ namespace SqlSugar
newValue = value.ToSqlValue();
}
}
if (columnInfo.UnderType == UtilConstants.StringType&& model.Conext?.SugarContext?.Context?.CurrentConnectionConfig?.DbType==DbType.SqlServer)
{
if (model.Conext?.SugarContext?.Context?.CurrentConnectionConfig?.MoreSettings?.DisableNvarchar != true)
{
if (columnInfo.SqlParameterDbType is System.Data.DbType type && type == System.Data.DbType.AnsiString)
{
}
else
{
newValue = "N" + newValue;
}
}
}
sql = sql.Replace(replace, newValue);
}
}
@ -1111,6 +1125,20 @@ namespace SqlSugar
else
{
newValue = value.ToSqlValue();
if (columnInfo.EntityName == "String" && model.Conext?.SugarContext?.Context?.CurrentConnectionConfig?.DbType == DbType.SqlServer)
{
if (model.Conext?.SugarContext?.Context?.CurrentConnectionConfig?.MoreSettings?.DisableNvarchar != true)
{
if (model.DataObject is EntityColumnInfo dc&& dc.SqlParameterDbType is System.Data.DbType type && type == System.Data.DbType.AnsiString)
{
}
else
{
newValue = "N" + newValue;
}
}
}
}
}
//Regex regex = new Regex("\@");
@ -1363,5 +1391,10 @@ namespace SqlSugar
{
return string.Join(",", model.Args.Select(it => it.MemberName));
}
public virtual string UNIX_TIMESTAMP(MethodCallExpressionModel model)
{
var parameterNameA = model.Args[0].MemberName;
return $" UNIX_TIMESTAMP({parameterNameA}) ";
}
}
}

View File

@ -131,5 +131,6 @@ namespace SqlSugar
string PgsqlArrayContains(MethodCallExpressionModel model);
string SelectFields(MethodCallExpressionModel model);
string Coalesce(MethodCallExpressionModel model);
string UNIX_TIMESTAMP(MethodCallExpressionModel model);
}
}

View File

@ -10,7 +10,10 @@ namespace SqlSugar
{
public partial class SqlFunc
{
public static long UNIX_TIMESTAMP(DateTime dateTime)
{
throw new NotSupportedException("Can only be used in expressions");
}
public static T Coalesce<T>(T value1, T value2)
{
throw new NotSupportedException("Can only be used in expressions");

View File

@ -84,7 +84,13 @@ namespace SqlSugar
this.Context.SingleTableNameSubqueryShortName = ps.FirstOrDefault().Name;
return;
}
else if (item is MethodCallExpression&&ExpressionTool.IsVariable(item))
else if (item is MethodCallExpression && ExpressionTool.IsVariable(item))
{
var p = GetNewExpressionValue(item);
parameter.Context.Result.Append(this.Context.GetAsString2(asName, p));
return;
}
else if (item is ConditionalExpression&& ExpressionTool.GetParameters(item).Count > 0)
{
var p = GetNewExpressionValue(item);
parameter.Context.Result.Append(this.Context.GetAsString2(asName, p));
@ -183,6 +189,30 @@ namespace SqlSugar
if (item is MemberInitExpression)
{
newExpressionInfos = ExpressionTool.GetNewexpressionInfos(item, this.Context, this);
var ignorePropertyNames = item.Type.GetProperties().Where(it => it.PropertyType.IsClass()&&!it.PropertyType.Name.StartsWith("System."))
.Select(it=>it.PropertyType.Name).ToList();
if (ignorePropertyNames.Count > 0)
{
var names = new List<string>() { };
foreach (MemberBinding binding in ((MemberInitExpression)item).Bindings)
{
names.Add(binding.Member.Name);
}
ignorePropertyNames = ignorePropertyNames.Where(it => !names.Contains(it)).ToList();
var q=this.Context?.SugarContext?.QueryBuilder;
if (q != null)
{
foreach (var ignorePropertyName in ignorePropertyNames)
{
if (q.SelectNewIgnoreColumns == null)
{
q.SelectNewIgnoreColumns = new List<KeyValuePair<string, string>>();
}
var addItem = new KeyValuePair<string,string>(ignorePropertyName,item.Type.Name);
q.SelectNewIgnoreColumns.Add(addItem);
}
}
}
}
else
{

View File

@ -298,16 +298,32 @@ namespace SqlSugar
var lamExp = (item as LambdaExpression);
var pExp = lamExp.Parameters[0];
var pname = pExp.Name;
var columns = this.Context.SugarContext.Context.EntityMaintenance.GetEntityInfo(pExp.Type).Columns;
if (columns.Count==0&&pExp.Type.IsValueType && pExp.Type != typeof(string))
{
columns = new List<EntityColumnInfo>() { new EntityColumnInfo() { UnderType=UtilMethods.GetUnderType( pExp.Type) ,PropertyName=pExp.Type.Name,DbTableName= pExp.Type.Name } };
}
model.Args.Add(new MethodCallExpressionArgs()
{
MemberValue = new ListAnyParameter()
{
Sql = sql,
Name = pname,
Columns = this.Context.SugarContext.Context.EntityMaintenance.GetEntityInfo(pExp.Type).Columns,
Columns = columns,
ConvetColumnFunc = this.Context.GetTranslationColumnName
}
});
if (lamExp.Body is MethodCallExpression callExpression)
{
var callObject = callExpression.Object;
if (callObject is MemberExpression memberExpression && memberExpression?.Expression is ParameterExpression parameterExpression)
{
var entity = this.Context.SugarContext.Context.EntityMaintenance.GetEntityInfo(parameterExpression.Type);
var columnInfo = entity.Columns.FirstOrDefault(it => it.PropertyName == memberExpression.Member.Name);
model.DataObject = columnInfo;
}
}
if (this.Context.IsSingle && this.Context.SingleTableNameSubqueryShortName == null)
{
ParameterExpressionVisitor visitor = new ParameterExpressionVisitor();

View File

@ -158,6 +158,19 @@ namespace SqlSugar
continue;
}
++i;
if (item is ParameterExpression)
{
var itemType = item.Type;
var ignoreProperty = itemType.GetProperties().FirstOrDefault(it => it.PropertyType == itemType);
if (ignoreProperty!=null&& ignoreProperty.Name!=memberName)
{
if (this.Context.SugarContext.QueryBuilder.SelectNewIgnoreColumns == null)
{
this.Context.SugarContext.QueryBuilder.SelectNewIgnoreColumns = new List<KeyValuePair<string, string>>();
}
this.Context.SugarContext.QueryBuilder.SelectNewIgnoreColumns.Add(new KeyValuePair<string, string>(ignoreProperty.Name, itemType.Name));
}
}
ResolveNewExpressions(parameter, item, memberName);
}
}

View File

@ -131,7 +131,7 @@ namespace SqlSugar
Check.ExceptionEasy(FirstPkColumn == null, $"{ last.ThisEntityInfo.EntityName} need PrimayKey", $"使用导航属性{ last.ThisEntityInfo.EntityName} 缺少主键");
var PkColumn = last.ParentEntityInfo.Columns.FirstOrDefault(it => it.PropertyName == last.Nav.Name);
Check.ExceptionEasy(PkColumn == null, $"{ last.ParentEntityInfo.EntityName} no found {last.Nav.Name}", $"{ last.ParentEntityInfo.EntityName} 不存在 {last.Nav.Name}");
queryable.Where($" {this.shorName}.{ queryable.SqlBuilder.GetTranslationColumnName(PkColumn.DbColumnName)} = {masterShortName}.{queryable.SqlBuilder.GetTranslationColumnName(FirstPkColumn.DbColumnName)} ");
queryable.Where($" {queryable.SqlBuilder.GetTranslationColumnName(this.shorName)}.{ queryable.SqlBuilder.GetTranslationColumnName(PkColumn.DbColumnName)} = {queryable.SqlBuilder.GetTranslationColumnName(masterShortName)}.{queryable.SqlBuilder.GetTranslationColumnName(FirstPkColumn.DbColumnName)} ");
queryable.WhereIF(this.whereSql.HasValue(), GetWhereSql1(this.whereSql,lastShortName, joinInfos, queryable.SqlBuilder));
MapperSql.Sql = $"( {queryable.ToSql().Key} ) ";
if (isAny)
@ -176,7 +176,7 @@ namespace SqlSugar
// navColum = item.ParentEntityInfo.Columns.FirstOrDefault(it => it.PropertyName == item.Nav.Name);
//}
Check.ExceptionEasy(pkColumn == null, $"{item.ThisEntityInfo.EntityName} need PrimayKey", $"使用导航属性{item.ThisEntityInfo.EntityName} 缺少主键");
var on = $" {shortName}.{queryable.SqlBuilder.GetTranslationColumnName(pkColumn.DbColumnName)}={formInfo.ThisEntityInfo.DbTableName + (i - 1)}.{queryable.SqlBuilder.GetTranslationColumnName(navColum.DbColumnName)}";
var on = $" {queryable.SqlBuilder.GetTranslationColumnName(shortName)}.{queryable.SqlBuilder.GetTranslationColumnName(pkColumn.DbColumnName)}={queryable.SqlBuilder.GetTranslationColumnName(formInfo.ThisEntityInfo.DbTableName + (i - 1))}.{queryable.SqlBuilder.GetTranslationColumnName(navColum.DbColumnName)}";
queryable.AddJoinInfo(item.ThisEntityInfo.DbTableName, shortName, on, JoinType.Inner);
++i;
index++;
@ -270,13 +270,13 @@ namespace SqlSugar
}
this.whereSql =Regex.Replace(this.whereSql, regex,
lastShortName + "." + sqlBuilder.GetTranslationColumnName(it.DbColumnName));
sqlBuilder.GetTranslationColumnName(lastShortName) + "." + sqlBuilder.GetTranslationColumnName(it.DbColumnName));
}
else
{
var oldWhere = this.whereSql;
var newWhere = this.whereSql.Replace(sqlBuilder.GetTranslationColumnName(it.DbColumnName),
lastShortName + "." + sqlBuilder.GetTranslationColumnName(it.DbColumnName));
sqlBuilder.GetTranslationColumnName(lastShortName) + "." + sqlBuilder.GetTranslationColumnName(it.DbColumnName));
if (oldWhere != newWhere && !oldWhere.Contains($" {sqlBuilder.GetTranslationColumnName(it.DbColumnName)}"))
{

View File

@ -0,0 +1,93 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
namespace SqlSugar
{
public class SubTake : ISubOperation
{
public bool HasWhere
{
get; set;
}
public ExpressionContext Context
{
get; set;
}
public Expression Expression
{
get; set;
}
public string Name
{
get
{
return "Take";
}
}
public int Sort
{
get
{
if (this.Context is SqlServerExpressionContext || this.Context.GetType().Name.Contains("Access"))
{
return 150;
}
else if (this.Context is OracleExpressionContext)
{
return 401;
}
else
{
return 490;
}
}
}
public string GetValue(Expression expression)
{
var numExp = (expression as MethodCallExpression).Arguments[0];
var num =1;
if (ExpressionTool.GetParameters(numExp).Any())
{
var copyContext = this.Context.GetCopyContextWithMapping();
copyContext.IsSingle = false;
copyContext.Resolve(numExp, ResolveExpressType.WhereMultiple);
copyContext.Result.GetString();
}
else
{
num = ExpressionTool.DynamicInvoke(numExp).ObjToInt();
}
var take = (expression as MethodCallExpression);
if (this.Context is SqlServerExpressionContext || this.Context.GetType().Name.Contains("Access"))
{
return "TOP " + num;
}
else if (this.Context is OracleExpressionContext)
{
return (HasWhere ? "AND" : "WHERE") + " ROWNUM<=" + num;
}
else if (this.Context is PostgreSQLExpressionContext || this.Context?.SugarContext?.Context?.CurrentConnectionConfig?.MoreSettings?.DatabaseModel == DbType.PostgreSQL)
{
return "limit " + num;
}
else if (this.Context.GetLimit() != null)
{
return this.Context.GetLimit();
}
else
{
return "limit " + num;
}
}
}
}

View File

@ -288,6 +288,10 @@ namespace SqlSugar
{
this.context.IsAsAttr = true;
}
if (isubList.Any(it => it is SubSelect) && isubList.Any(it => it is SubTake))
{
isubList.RemoveAll(it => it is SubTake);
}
List<string> result = isubList.Select(it =>
{
it.HasWhere = isHasWhere;

View File

@ -40,7 +40,8 @@ namespace SqlSugar
new SubDistinctCount{ Context=Context },
new SubToList{ Context=Context},
new SubFirst(){ Context=Context },
new SubAsWithAttr(){ Context=Context }
new SubAsWithAttr(){ Context=Context },
new SubTake(){ Context=Context }
};
}

View File

@ -224,5 +224,10 @@ namespace SqlSugar
{
return this;
}
public Subqueryable<T> Take(int takeNum)
{
return this;
}
}
}

View File

@ -69,6 +69,10 @@ namespace SqlSugar
{
return null;
}
public new Subqueryable<T1, T2, T3, T4, T5, T6, T7, T8,T9> Take(int takeNum)
{
return this;
}
}
public class Subqueryable<T1, T2, T3, T4, T5, T6, T7, T8> : Subqueryable<T1> where T1 : class, new()
{
@ -128,6 +132,10 @@ namespace SqlSugar
{
return null;
}
public new Subqueryable<T1, T2, T3, T4, T5, T6, T7,T8> Take(int takeNum)
{
return this;
}
}
public class Subqueryable<T1, T2, T3, T4, T5, T6, T7> : Subqueryable<T1> where T1 : class, new()
{
@ -183,6 +191,10 @@ namespace SqlSugar
{
return null;
}
public new Subqueryable<T1, T2, T3, T4, T5, T6,T7> Take(int takeNum)
{
return this;
}
}
public class Subqueryable<T1, T2, T3, T4, T5, T6> : Subqueryable<T1> where T1 : class, new()
{
@ -243,6 +255,10 @@ namespace SqlSugar
{
return null;
}
public new Subqueryable<T1, T2, T3, T4, T5,T6> Take(int takeNum)
{
return this;
}
}
public class Subqueryable<T1, T2, T3, T4, T5> : Subqueryable<T1> where T1 : class, new()
{
@ -299,6 +315,10 @@ namespace SqlSugar
{
return null;
}
public new Subqueryable<T1, T2, T3, T4,T5> Take(int takeNum)
{
return this;
}
}
public class Subqueryable<T1, T2, T3, T4> : Subqueryable<T1> where T1 : class, new()
{
@ -415,6 +435,11 @@ namespace SqlSugar
{
return default(TResult);
}
public new Subqueryable<T1, T2, T3,T4> Take(int takeNum)
{
return this;
}
}
public class Subqueryable<T1, T2, T3> : Subqueryable<T1> where T1 : class, new()
{
@ -543,6 +568,10 @@ namespace SqlSugar
{
return default(TResult);
}
public new Subqueryable<T1, T2,T3> Take(int takeNum)
{
return this;
}
}
public class Subqueryable<T1, T2> : Subqueryable<T1> where T1 : class, new()
{
@ -663,5 +692,9 @@ namespace SqlSugar
{
return default(TResult);
}
public new Subqueryable<T1,T2> Take(int takeNum)
{
return this;
}
}
}

View File

@ -507,7 +507,16 @@ namespace SqlSugar
}
else
{
result.Add(name, DataReaderToDynamicList_Part(readerValues, item, reval, mappingKeys));
List<string> ignorePropertyNames = null;
if (this.QueryBuilder?.SelectNewIgnoreColumns?.Any() == true)
{
var ignoreColumns= this.QueryBuilder.SelectNewIgnoreColumns.Where(it => it.Value == item.PropertyType.Name).ToList();
if (ignoreColumns.Any())
{
ignorePropertyNames = ignoreColumns.Select(it => it.Key).ToList();
}
}
result.Add(name, DataReaderToDynamicList_Part(readerValues, item, reval, mappingKeys, ignorePropertyNames));
}
}
else
@ -645,7 +654,7 @@ namespace SqlSugar
Regex.IsMatch(readerValues.First(y => y.Key.EqualCase(item.Name)).Value.ToString(), @"^\[{.+\}]$");
}
private Dictionary<string, object> DataReaderToDynamicList_Part<T>(Dictionary<string, object> readerValues, PropertyInfo item, List<T> reval, Dictionary<string, string> mappingKeys = null)
private Dictionary<string, object> DataReaderToDynamicList_Part<T>(Dictionary<string, object> readerValues, PropertyInfo item, List<T> reval, Dictionary<string, string> mappingKeys = null,List<string> ignoreColumns=null)
{
Dictionary<string, object> result = new Dictionary<string, object>();
var type = item.PropertyType;
@ -673,6 +682,10 @@ namespace SqlSugar
var typeName = type.Name;
if (prop.PropertyType.IsClass())
{
if (ignoreColumns?.Contains(name) == true)
{
continue;
}
var suagrColumn = prop.GetCustomAttribute<SugarColumn>();
if (suagrColumn != null && suagrColumn.IsJson)
{

View File

@ -37,6 +37,7 @@ namespace SqlSugar
TimeSpan SqlExecutionTime { get; }
TimeSpan ConnectionExecutionTime { get; }
int SqlExecuteCount { get; }
SugarActionType SqlExecuteType { get;}
IDbBind DbBind { get; }
void SetCommandToAdapter(IDataAdapter adapter, DbCommand command);
IDataAdapter GetAdapter();

View File

@ -192,6 +192,7 @@
<Compile Include="ExpressionsToSql\Subquery\Items\SubDistinctCount.cs" />
<Compile Include="ExpressionsToSql\Subquery\Items\SubFirst.cs" />
<Compile Include="ExpressionsToSql\Subquery\Items\SubSelectStringJoin.cs" />
<Compile Include="ExpressionsToSql\Subquery\Items\SubTake.cs" />
<Compile Include="ExpressionsToSql\Subquery\Items\SubToList.cs" />
<Compile Include="ExpressionsToSql\Subquery\Items\SubWithNoLock.cs" />
<Compile Include="ExpressionsToSql\Subquery\Items\SubEnableTableFilter.cs" />

View File

@ -18,6 +18,49 @@ namespace SqlSugar
{
public class UtilMethods
{
public static DataTable ConvertDateTimeOffsetToDateTime(DataTable table)
{
if (!table.Columns.Cast<DataColumn>().Any(it => it.DataType == typeof(DateTimeOffset)))
{
return table;
}
DataTable newTable = table.Clone();
newTable.TableName = table.TableName;
// 替换所有 DateTimeOffset 列为 DateTime
foreach (DataColumn column in newTable.Columns)
{
if (column.DataType == typeof(DateTimeOffset))
{
column.DataType = typeof(DateTime); // 会报错,不能直接改
}
}
// 需要重新构建新表结构
DataTable finalTable = new DataTable();
finalTable.TableName = table.TableName;
foreach (DataColumn column in table.Columns)
{
Type newType = column.DataType == typeof(DateTimeOffset) ? typeof(DateTime) : column.DataType;
finalTable.Columns.Add(column.ColumnName, newType);
}
// 拷贝并转换数据
foreach (DataRow row in table.Rows)
{
DataRow newRow = finalTable.NewRow();
foreach (DataColumn column in table.Columns)
{
var value = row[column];
if (value is DateTimeOffset dto)
newRow[column.ColumnName] = dto.DateTime;
else
newRow[column.ColumnName] = value;
}
finalTable.Rows.Add(newRow);
}
return finalTable;
}
public static string EscapeLikeValue(ISqlSugarClient db, string value, char wildcard='%')
{
var dbType = db.CurrentConnectionConfig.DbType;
@ -38,8 +81,16 @@ namespace SqlSugar
case DbType.Odbc:
case DbType.TDSQLForPGODBC:
// SQL Server 使用中括号转义 %, _ 等
value = value.Replace("[", "[[]")
.Replace("]", "[]]")
var keyLeft = "[[]";
var keyRight = "[]]";
var leftGuid = Guid.NewGuid().ToString();
var rightGuid = Guid.NewGuid().ToString();
value = value.Replace("[", leftGuid)
.Replace("]", rightGuid);
value = value.Replace(leftGuid, keyLeft)
.Replace(rightGuid, keyRight);
value =value
.Replace(wildcardStr, $"[{wildcard}]");
break;
@ -1743,7 +1794,7 @@ namespace SqlSugar
}
else
{
result = result.Replace(item.ParameterName, $"N'{item.Value.ObjToString().Replace("@", guid).ToSqlFilter()}'");
result = result.Replace(item.ParameterName, $"N'{item.Value.ObjToStringNoTrim().Replace("@", guid).ToSqlFilter()}'");
}
}
}