mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2025-06-28 13:34:32 +08:00
Synchronous code
This commit is contained in:
parent
03bf65e647
commit
8b8b7f6127
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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 =>
|
||||
{
|
||||
|
@ -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;
|
||||
|
@ -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; }
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
@ -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; }
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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; }
|
||||
|
@ -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}) ";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -131,5 +131,6 @@ namespace SqlSugar
|
||||
string PgsqlArrayContains(MethodCallExpressionModel model);
|
||||
string SelectFields(MethodCallExpressionModel model);
|
||||
string Coalesce(MethodCallExpressionModel model);
|
||||
string UNIX_TIMESTAMP(MethodCallExpressionModel model);
|
||||
}
|
||||
}
|
||||
|
@ -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");
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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)}"))
|
||||
{
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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;
|
||||
|
@ -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 }
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -224,5 +224,10 @@ namespace SqlSugar
|
||||
{
|
||||
return this;
|
||||
}
|
||||
|
||||
public Subqueryable<T> Take(int takeNum)
|
||||
{
|
||||
return this;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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();
|
||||
|
@ -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" />
|
||||
|
@ -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()}'");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user