Synchronous code

This commit is contained in:
sunkaixuan
2025-10-25 13:58:32 +08:00
parent b3f7fed97e
commit 976d2802e5
23 changed files with 342 additions and 29 deletions

View File

@@ -207,6 +207,7 @@ namespace SqlSugar
#region Core Logic
private void GetDifferenceTables(TableDifferenceProvider result, Type type)
{
var isCreate = false;
var tempTableName = "TempDiff" + DateTime.Now.ToString("yyMMssHHmmssfff");
var oldTableName = this.Context.EntityMaintenance.GetEntityInfo(type).DbTableName;
var db = new SqlSugarProvider(UtilMethods.CopyConfig(this.Context.CurrentConnectionConfig));
@@ -224,6 +225,7 @@ namespace SqlSugar
var codeFirst=db.CodeFirst;
codeFirst.SetStringDefaultLength(this.DefultLength);
codeFirst.InitTables(type);
isCreate = true;
var tables = db.DbMaintenance.GetTableInfoList(false);
var oldTableInfo = tables.FirstOrDefault(it=>it.Name.EqualCase(oldTableName));
var newTableInfo = tables.FirstOrDefault(it => it.Name.EqualCase(oldTableName));
@@ -248,7 +250,10 @@ namespace SqlSugar
}
finally
{
db.DbMaintenance.DropTable(tempTableName);
if (isCreate)
{
db.DbMaintenance.DropTable(tempTableName);
}
}
}
protected virtual void Execute(Type entityType,EntityInfo entityInfo)

View File

@@ -106,28 +106,29 @@ namespace SqlSugar
Type mappingTableType = navigate.MappingType;
string typeAiD = navigate.MappingAId;
string typeBId = navigate.MappingBId;
var queryPropertyNames = navigate.QueryPropertyNames;
ConstructorInfo constructor;
object[] constructorArgs;
if (mappingTableType != null && typeAiD != null && typeBId != null)
{
constructor = typeof(Navigate).GetConstructor(new Type[] { typeof(Type), typeof(string), typeof(string), typeof(string) });
constructorArgs = new object[] { mappingTableType, typeAiD, typeBId, whereSql };
constructor = typeof(Navigate).GetConstructor(new Type[] { typeof(Type), typeof(string), typeof(string), typeof(string), typeof(string[]) });
constructorArgs = new object[] { mappingTableType, typeAiD, typeBId, whereSql , queryPropertyNames };
}
else if (!string.IsNullOrEmpty(whereSql))
{
constructor = typeof(Navigate).GetConstructor(new Type[] { typeof(NavigateType), typeof(string), typeof(string), typeof(string) });
constructorArgs = new object[] { navigatType, name, name2, whereSql };
constructor = typeof(Navigate).GetConstructor(new Type[] { typeof(NavigateType), typeof(string), typeof(string), typeof(string), typeof(string[]) });
constructorArgs = new object[] { navigatType, name, name2, whereSql, queryPropertyNames };
}
else if (!string.IsNullOrEmpty(name2))
{
constructor = typeof(Navigate).GetConstructor(new Type[] { typeof(NavigateType), typeof(string), typeof(string) });
constructorArgs = new object[] { navigatType, name, name2 };
constructor = typeof(Navigate).GetConstructor(new Type[] { typeof(NavigateType), typeof(string), typeof(string), typeof(string[]) });
constructorArgs = new object[] { navigatType, name, name2, queryPropertyNames };
}
else
{
constructor = typeof(Navigate).GetConstructor(new Type[] { typeof(NavigateType), typeof(string) });
constructorArgs = new object[] { navigatType, name };
constructor = typeof(Navigate).GetConstructor(new Type[] { typeof(NavigateType), typeof(string), typeof(string[]) });
constructorArgs = new object[] { navigatType, name, queryPropertyNames };
}
return new CustomAttributeBuilder(constructor, constructorArgs);

View File

@@ -7,6 +7,7 @@ using System.Linq;
using System.Threading;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Linq.Expressions;
namespace SqlSugar
{
public partial class FastestProvider<T>:IFastest<T> where T:class,new()
@@ -244,6 +245,21 @@ namespace SqlSugar
return BulkMergeAsync(datas, whereColumns, updateColumns).GetAwaiter().GetResult();
}
public async Task<int> BulkMergeAsync(List<T> datas, Expression<Func<T, object>> whereColumnsExp, Expression<Func<T, object>> updateColumnsExp)
{
// 1. 获取 whereColumns
var whereColumns =ExpressionTool.GetNewExpressionItemListNew((whereColumnsExp as LambdaExpression).Body).Select(it=>it.Key).ToArray();
// 2. 获取 updateColumns
var updateColumns = ExpressionTool.GetNewExpressionItemListNew((updateColumnsExp as LambdaExpression).Body).Select(it => it.Key).ToArray();
// 3. 调用 BulkMergeAsync
return await BulkMergeAsync(datas, whereColumns, updateColumns);
}
public int BulkMerge(List<T> datas, Expression<Func<T, object>> whereColumnsExp, Expression<Func<T, object>> updateColumnsExp)
{
return BulkMergeAsync(datas, whereColumnsExp, updateColumnsExp).GetAwaiter().GetResult();
}
private async Task<int> _BulkMerge(List<T> datas, string[] updateColumns, string[] whereColumns)
{
try

View File

@@ -4,6 +4,7 @@ using System.Data;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace SqlSugar
@@ -85,7 +86,7 @@ namespace SqlSugar
List<string> uInt64TypeName = new List<string>();
foreach (DataColumn item in tempDataTable.Columns)
{
if (item.DataType == typeof(UInt64))
if (item.DataType == typeof(UInt64))
{
uInt64TypeName.Add(item.ColumnName);
}
@@ -98,13 +99,43 @@ namespace SqlSugar
dt.Columns.Add(item.ColumnName, item.DataType);
}
}
bool supportIdentity = true;
if (this.context.CurrentConnectionConfig.DbType == DbType.PostgreSQL || this.context.CurrentConnectionConfig.DbType == DbType.Vastbase)
{
supportIdentity = false;
}
if (!supportIdentity)
{
// PostgreSQL/Vastbase不支持自增主键导入
foreach (var identityColumnInfo in this.entityInfo.Columns.Where(it => it.IsIdentity))
{
if (dt.Columns.Contains(identityColumnInfo.DbColumnName))
{
dt.Columns.Remove(identityColumnInfo.DbColumnName);
}
}
}
dt.TableName = GetTableName();
var columns = entityInfo.Columns;
var columns = supportIdentity ? entityInfo.Columns : entityInfo.Columns.Where(it => !it.IsIdentity).ToList();
if (columns.Where(it=>!it.IsIgnore).Count() > tempDataTable.Columns.Count)
{
var tempColumns = tempDataTable.Columns.Cast<DataColumn>().Select(it=>it.ColumnName);
columns = columns.Where(it => tempColumns.Any(s => s.EqualCase(it.DbColumnName))).ToList();
}
MyTuple myTuple = GetDiscrimator();
if (myTuple.isDiscrimator && myTuple.discrimatorDict?.Count > 0)
{
foreach (var dict in myTuple.discrimatorDict)
{
if (!dt.Columns.Contains(dict.Key))
dt.Columns.Add(dict.Key);
}
}
var isMySql = this.context.CurrentConnectionConfig.DbType.IsIn(DbType.MySql, DbType.MySqlConnector);
var isSqliteCore = SugarCompatible.IsFramework==false&& this.context.CurrentConnectionConfig.DbType.IsIn(DbType.Sqlite);
foreach (var item in datas)
@@ -168,6 +199,15 @@ namespace SqlSugar
}
dr[name] = value;
}
if (myTuple.isDiscrimator && myTuple.discrimatorDict?.Count > 0)
{
foreach (var dict in myTuple.discrimatorDict)
{
var key = dict.Key; var val = dict.Value;
if (!string.IsNullOrWhiteSpace(val) && string.IsNullOrWhiteSpace(dr[key] + ""))
dr[key] = val;
}
}
dt.Rows.Add(dr);
}
@@ -353,5 +393,36 @@ namespace SqlSugar
}
}
private MyTuple GetDiscrimator()
{
var isDiscrimator = entityInfo.Discrimator.HasValue();
var dict = new Dictionary<string, string>();
if (isDiscrimator)
{
Check.ExceptionEasy(!Regex.IsMatch(entityInfo.Discrimator, @"^(?:\w+:\w+)(?:,\w+:\w+)*$"), "The format should be type:cat for this type, and if there are multiple, it can be FieldName:cat,FieldName2:dog ", "格式错误应该是type:cat这种格式如果是多个可以FieldName:cat,FieldName2:dog不要有空格");
var array = entityInfo.Discrimator.Split(',');
foreach (var disItem in array)
{
var name = disItem.Split(':').First();
var value = disItem.Split(':').Last();
if(!dict.ContainsKey(name))
dict.Add(name, value);
}
}
return new MyTuple(isDiscrimator, dict);
}
}
internal class MyTuple
{
public bool isDiscrimator;
public Dictionary<string, string> discrimatorDict;
public MyTuple(bool isDiscrimator, Dictionary<string, string> dict)
{
this.isDiscrimator = isDiscrimator;
this.discrimatorDict = dict;
}
}
}

View File

@@ -375,7 +375,7 @@ namespace SqlSugar
{
var name = disItem.Split(':').First();
var value = disItem.Split(':').Last();
insertItem.Add(new DbColumnInfo() { DbColumnName = name, PropertyName = name, PropertyType = typeof(string), Value = value });
insertItem.Add(new DbColumnInfo() { TableId=i, DbColumnName = name, PropertyName = name, PropertyType = typeof(string), Value = value });
}
}
}

View File

@@ -271,7 +271,11 @@ namespace SqlSugar
var sql = GetWhereSql(GetCrossDatabase(abDb, bEntity));
if (sql.SelectString == null)
{
//加载指定列
var manualPropertyNames = GetQueryPropertyNames(navObjectNameColumnInfo);
var columns = bEntityInfo.Columns.Where(it => !it.IsIgnore)
.WhereIF(manualPropertyNames != null && manualPropertyNames.Length > 0, it => manualPropertyNames.Contains(it.PropertyName))
.Select(it => GetOneToManySelectByColumnInfo(it, abDb)).ToList();
sql.SelectString = String.Join(",", columns);
}
@@ -433,7 +437,11 @@ namespace SqlSugar
var sqlObj = GetWhereSql(db, navObjectNameColumnInfo.Navigat.Name);
if (sqlObj.SelectString == null)
{
// 加载指定列
var queryPropertyNames = GetQueryPropertyNames(navObjectNameColumnInfo);
var columns = navEntityInfo.Columns.Where(it => !it.IsIgnore)
.WhereIF(queryPropertyNames != null && queryPropertyNames.Length > 0, it => queryPropertyNames.Contains(it.PropertyName))
.Select(it => GetOneToOneSelectByColumnInfo(it, db)).ToList();
sqlObj.SelectString = String.Join(",", columns);
}
@@ -581,7 +589,10 @@ namespace SqlSugar
{
if (sqlObj.SelectString == null)
{
//加载指定列
var manualPropertyNames = GetQueryPropertyNames(navObjectNameColumnInfo);
var columns = navEntityInfo.Columns.Where(it => !it.IsIgnore)
.WhereIF(manualPropertyNames != null && manualPropertyNames.Length > 0, it => manualPropertyNames.Contains(it.PropertyName))
.Select(it => GetOneToManySelectByColumnInfo(it, childDb)).ToList();
sqlObj.SelectString = String.Join(",", columns);
}
@@ -699,7 +710,11 @@ namespace SqlSugar
{
if (sqlObj.SelectString == null)
{
//加载指定列
var manualPropertyNames = GetQueryPropertyNames(navObjectNameColumnInfo);
var columns = navEntityInfo.Columns.Where(it => !it.IsIgnore)
.WhereIF(manualPropertyNames != null && manualPropertyNames.Length > 0, it => manualPropertyNames.Contains(it.PropertyName))
.Select(it => GetOneToManySelectByColumnInfo(it,childDb)).ToList();
sqlObj.SelectString = String.Join(",", columns);
}
@@ -1252,5 +1267,38 @@ namespace SqlSugar
return QueryBuilder.Builder.GetTranslationColumnName(it.DbColumnName) + " AS " + QueryBuilder.Builder.GetTranslationColumnName(it.PropertyName);
}
/// <summary>
/// 获取查询的属性名称列表
/// </summary>
/// <param name="navObjectNamePropety"></param>
/// <returns></returns>
private string[] GetQueryPropertyNames(EntityColumnInfo navObjectNameColumnInfo)
{
string[] queryPropertyNames = null;
if (navObjectNameColumnInfo?.Navigat?.QueryPropertyNames?.Any()==true)
{
var navInfo = navObjectNameColumnInfo?.Navigat;
queryPropertyNames = navObjectNameColumnInfo.Navigat.QueryPropertyNames;
var list = queryPropertyNames.ToList();
if (navInfo.AClassId != null)
{
list.Add(navInfo.AClassId);
}
if (navInfo.BClassId != null)
{
list.Add(navInfo.BClassId);
}
if (navInfo.Name != null)
{
list.Add(navInfo.Name);
}
if (navInfo.Name2 != null)
{
list.Add(navInfo.Name2);
}
queryPropertyNames = list.ToArray();
}
return queryPropertyNames;
}
}
}

View File

@@ -164,6 +164,7 @@ namespace SqlSugar
{
var copyDb = this.Clone();
copyDb.QueryBuilder.OrderByValue = null;
copyDb.QueryBuilder.Includes = null;
var list = await copyDb.Select<int>(" COUNT(1) ").ToListAsync();
return list.FirstOrDefault();
}

View File

@@ -13,7 +13,7 @@ using System.Collections.ObjectModel;
using NetTaste;
using Newtonsoft.Json.Linq;
using System.Xml.Linq;
using System.Runtime.CompilerServices;
using System.Runtime.CompilerServices;
namespace SqlSugar
@@ -866,6 +866,15 @@ namespace SqlSugar
{
propertyInfo.SetValue(addItem,UtilMethods.To( kv.Value, propertyInfo.PropertyType));
}
else if (kv.Value is string s&&
s!=null&&
s?.StartsWith("[")==true&&
s?.EndsWith("]") == true&&
UtilMethods.IsArrayOrList(propertyInfo.PropertyType)
)
{
propertyInfo.SetValue(addItem, UtilMethods.ConvertToArray(kv.Value?.ToString(), propertyInfo.PropertyType));
}
else
{
propertyInfo.SetValue(addItem, kv.Value);

View File

@@ -216,7 +216,14 @@ namespace SqlSugar
if (isLeftJoin == false)
{
result.QueryBuilder.JoinQueryInfos.Remove(result.QueryBuilder.JoinQueryInfos.Last());
result.QueryBuilder.AsTables = oldAsName;
if (oldAsName?.Any() == false && result.QueryBuilder.AsTables?.Any() == true)
{
//no things
}
else
{
result.QueryBuilder.AsTables = oldAsName;
}
}
return result;
}
@@ -227,7 +234,14 @@ namespace SqlSugar
if (isJoin == false)
{
result.QueryBuilder.JoinQueryInfos.Remove(result.QueryBuilder.JoinQueryInfos.Last());
result.QueryBuilder.AsTables = oldAsName;
if (oldAsName?.Any() == false && result.QueryBuilder.AsTables?.Any() == true)
{
//no things
}
else
{
result.QueryBuilder.AsTables = oldAsName;
}
}
return result;
}

View File

@@ -215,6 +215,10 @@ namespace SqlSugar
{
return $" CAST( NULL AS timestamp) ";
}
else if (entityColumnInfo != null && entityColumnInfo.IsJson && value!=null)
{
return $"'{this.Context.Utilities.SerializeObject(value).ToSqlFilter()}'";
}
if (value == null)
return "null";
var type =UtilMethods.GetUnderType(value.GetType());

View File

@@ -527,6 +527,9 @@ namespace SqlSugar
break;
case DbType.PolarDB:
config.DbType = DbType.MySql;
if (this.CurrentConnectionConfig.MoreSettings == null)
this.CurrentConnectionConfig.MoreSettings = new ConnMoreSettings();
this.CurrentConnectionConfig.MoreSettings.DatabaseModel = DbType.PolarDB;
break;
case DbType.TDSQL:
config.DbType = DbType.MySql;

View File

@@ -275,7 +275,18 @@ namespace SqlSugar
public IUpdateable<T, T2> InnerJoin<T2>(ISugarQueryable<T2> queryable, Expression<Func<T, T2, bool>> joinExpress)
{
var tableName = $" ({queryable.Clone().ToSqlString()}) "; ;
return this.InnerJoin(joinExpress, tableName);
return this.InnerJoin<T2>(tableName, joinExpress,this.UpdateBuilder.TableName);
}
public IUpdateable<T, T2> InnerJoin<T2>(string joinTable, Expression<Func<T, T2, bool>> joinExpress, string tableName)
{
UpdateableProvider<T, T2> result = new UpdateableProvider<T, T2>();
result.updateableObj = this;
var querybale = this.Context.Queryable<T>().LeftJoin<T2>(joinExpress);
result.updateableObj.UpdateBuilder.JoinInfos = querybale.QueryBuilder.JoinQueryInfos;
result.updateableObj.UpdateBuilder.JoinInfos.Last().TableName = joinTable;
result.updateableObj.UpdateBuilder.ShortName = joinExpress.Parameters.FirstOrDefault()?.Name;
result.updateableObj.UpdateBuilder.TableName = tableName;
return result;
}
public IUpdateable<T, T2> InnerJoin<T2>(Expression<Func<T, T2, bool>> joinExpress,string TableName)
{

View File

@@ -243,6 +243,15 @@ namespace SqlSugar
internal string BClassId { get; set; }
/// <summary>
/// 用于查询指定列
/// </summary>
internal string[] QueryPropertyNames { get; set; }
public string[] GetQueryPropertyNames()
{
return QueryPropertyNames;
}
public string GetName()
{
return Name;
@@ -272,36 +281,40 @@ namespace SqlSugar
{
return WhereSql;
}
public Navigate(NavigateType navigatType,string ifSingleMasterTableColumn_IfListChildTableColumn)
public Navigate(NavigateType navigatType,string ifSingleMasterTableColumn_IfListChildTableColumn, string[] queryPropertyNames = null)
{
this.Name = ifSingleMasterTableColumn_IfListChildTableColumn;
this.NavigatType = navigatType;
this.QueryPropertyNames = queryPropertyNames;
}
public Navigate(NavigateType navigatType, string ifSingleMasterTableColumn_IfListChildTableColumn, string ifSingleChildTableColumn_IfListMasterTableColumn)
public Navigate(NavigateType navigatType, string ifSingleMasterTableColumn_IfListChildTableColumn, string ifSingleChildTableColumn_IfListMasterTableColumn, string[] queryPropertyNames = null)
{
Check.ExceptionEasy(navigatType == NavigateType.ManyToMany, "Correct usage [Navigate(typeof(ABMapping), nameof(abmapping.aid), nameof(abmapp.bid))], incorrect usage: [Navigate(Navigate.ManyToMany, nameof(ABMapping.Aid), nameof(ABMapping.BId))]", "多对多第一个参数是Type不是NavigateType正确用法[Navigate(typeof(ABMapping), nameof(ABMapping.Aid), nameof(ABMapping.BId))],错误用法:[Navigate(Navigate.ManyToMany, nameof(ABMapping.Aid), nameof(ABMapping.BId))]");
this.Name = ifSingleMasterTableColumn_IfListChildTableColumn;
this.Name2 = ifSingleChildTableColumn_IfListMasterTableColumn;
this.NavigatType = navigatType;
this.QueryPropertyNames = queryPropertyNames;
}
public Navigate(NavigateType navigatType, string ifSingleMasterTableColumn_IfListChildTableColumn, string ifSingleChildTableColumn_IfListMasterTableColumn, string whereSql)
public Navigate(NavigateType navigatType, string ifSingleMasterTableColumn_IfListChildTableColumn, string ifSingleChildTableColumn_IfListMasterTableColumn, string whereSql, string[] queryPropertyNames = null)
{
this.Name = ifSingleMasterTableColumn_IfListChildTableColumn;
this.Name2 = ifSingleChildTableColumn_IfListMasterTableColumn;
this.NavigatType = navigatType;
this.WhereSql = whereSql;
this.QueryPropertyNames = queryPropertyNames;
//Check.ExceptionEasy(navigatType != NavigateType.OneToOne, "Currently, only one-to-one navigation configuration Sql conditions are supported", "目前导航配置Sql条件只支持一对一");
}
public Navigate(Type MappingTableType,string typeAId,string typeBId)
public Navigate(Type MappingTableType,string typeAId,string typeBId, string[] queryPropertyNames = null)
{
this.MappingType = MappingTableType;
this.MappingAId = typeAId;
this.MappingBId = typeBId;
this.NavigatType = NavigateType.ManyToMany;
this.QueryPropertyNames = queryPropertyNames;
}
public Navigate(Type MappingTableType, string mappingAId, string mappingBId,string aClassId,string bClassId)
public Navigate(Type MappingTableType, string mappingAId, string mappingBId,string aClassId,string bClassId, string[] queryPropertyNames = null)
{
this.MappingType = MappingTableType;
this.MappingAId = mappingAId;
@@ -309,14 +322,16 @@ namespace SqlSugar
this.AClassId = aClassId;
this.BClassId = bClassId;
this.NavigatType = NavigateType.ManyToMany;
this.QueryPropertyNames = queryPropertyNames;
}
public Navigate(Type MappingTableType, string typeAiD, string typeBId,string mappingSql)
public Navigate(Type MappingTableType, string typeAiD, string typeBId,string mappingSql, string[] queryPropertyNames = null)
{
this.MappingType = MappingTableType;
this.MappingAId = typeAiD;
this.MappingBId = typeBId;
this.NavigatType = NavigateType.ManyToMany;
this.WhereSql+= mappingSql;
this.QueryPropertyNames = queryPropertyNames;
}
}

View File

@@ -27,6 +27,13 @@ namespace SqlSugar
@DateTimeOffset,
@Single,
@TimeSpan,
@char
@char,
@NpgsqlBox,
@NpgsqlCircle,
@NpgsqlLine,
@NpgsqlLseg,
@NpgsqlPath,
@NpgsqlPoint,
@NpgsqlPolygon,
}
}

View File

@@ -303,7 +303,19 @@ namespace SqlSugar
GetTopLevelMethodCalls(lambdaExpression.Body, methodCalls);
}
}
public static Dictionary<string, Expression> GetNewExpressionItemListNew(Expression lamExp)
{
var caseExp = GetLambdaExpressionBody(lamExp);
caseExp = ExpressionTool.RemoveConvert(lamExp);
if (caseExp is MemberExpression c)
{
return new Dictionary<string, Expression>() { { c.Member.Name, c } };
}
else
{
return GetNewExpressionItemList(lamExp);
}
}
public static Dictionary<string, Expression> GetNewExpressionItemList(Expression lamExp)
{
var caseExp = GetLambdaExpressionBody(lamExp);
@@ -359,10 +371,16 @@ namespace SqlSugar
}
public static List<ParameterExpression> GetParameters(Expression expr)
{
var ps = new ParameterExpressionVisitor();
var ps = new ParameterExpressionVisitor();
ps.Visit(expr);
return ps.Parameters;
}
public static bool NoParameterOrSqlfunc(Expression expr)
{
var ps = new ParameterExpressionVisitor();
ps.Visit(expr);
return ps.Parameters.Count==0&&ps.IsSqlFunc==false;
}
public static bool IsComparisonOperatorBool(BinaryExpression binaryExp)
{
return binaryExp.NodeType.IsIn(ExpressionType.Equal,

View File

@@ -10,6 +10,7 @@ namespace SqlSugar
{
internal class ParameterExpressionVisitor : ExpressionVisitor
{
public bool IsSqlFunc { get; set; }
public List<ParameterExpression> Parameters { get; } = new List<ParameterExpression>();
protected override Expression VisitParameter(ParameterExpression node)
@@ -17,6 +18,14 @@ namespace SqlSugar
Parameters.Add(node);
return base.VisitParameter(node);
}
protected override Expression VisitMethodCall(MethodCallExpression node)
{
if (node.Method?.DeclaringType==typeof(SqlFunc))
{
IsSqlFunc = true;
}
return base.VisitMethodCall(node);
}
}
internal class MethodCallExpressionVisitor : ExpressionVisitor
{

View File

@@ -9,6 +9,7 @@ namespace SqlSugar
{
public partial class DefaultDbMethod : IDbMethods
{
public ISqlSugarClient sqlSugarClient { get; set; }
public virtual string ParameterKeyWord { get; set; }= "@";
public virtual string RowNumber(MethodCallExpressionModel model)
{

View File

@@ -11,6 +11,7 @@ namespace SqlSugar
{
public interface IDbMethods
{
ISqlSugarClient sqlSugarClient { get; set; }
string IIF(MethodCallExpressionModel model);
string HasNumber(MethodCallExpressionModel model);
string HasValue(MethodCallExpressionModel model);

View File

@@ -18,7 +18,7 @@ namespace SqlSugar
express.IfFalse
};
SetSingleTableNameSubqueryShortName(express);
if (ExpressionTool.GetParameters(express.Test).Count == 0)
if (ExpressionTool.NoParameterOrSqlfunc(express.Test))
{
while (express != null)
{

View File

@@ -65,6 +65,7 @@ namespace SqlSugar
result = string.Join(",",(constant.Value+"").Split(',').Select(it=>this.Context.GetTranslationTableName(it)));
}
}
this.Context.DbMehtods.sqlSugarClient = this.Context?.SugarContext?.Context;
result = this.Context.DbMehtods.GetStringJoinSelector(result, ExpressionTool.GetExpressionValue(exp.Arguments[1]) + "");
return result;

View File

@@ -304,16 +304,34 @@ namespace SqlSugar
{
this.context.CurrentShortName=ExpressionTool.GetParameters(allMethods.FirstOrDefault()).FirstOrDefault().Name;
}
var hasNolock = false;
List<string> result = isubList.Select(it =>
{
it.HasWhere = isHasWhere;
return it.GetValue(it.Expression);
if (it is SubWithNolock)
{
hasNolock = true;
}
var innerResult = it.GetValue(it.Expression);
var innerIsJoin = (it is SubLeftJoin || it is SubInnerJoin);
var isSqlServer =UtilMethods.GetDatabaseType(this.context) == DbType.SqlServer;
if (hasNolock && innerIsJoin&& isSqlServer)
{
innerResult = innerResult.Replace("] ON (", "] " + SqlWith.NoLock + " ON (");
}
return innerResult;
}).ToList();
if (this.context?.SugarContext?.Context?.CurrentConnectionConfig?.DbType == DbType.Oracle && isubList.Any(s => s is SubSelect) && isubList.Any(s => s is SubOrderBy || s is SubOrderByDesc))
{
result.Insert(0, "SELECT * FROM(");
result.Add(") WHERE ROWNUM = 1 ");
}
this.context.JoinIndex = 0;
this.context.IsAsAttr = false;
return result;
}
private static void SetOrderByIndex(List<ISubOperation> isubList)
{
var orderByIndex = 0;

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.Data;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
@@ -45,6 +46,7 @@ namespace SqlSugar
int BulkMerge(List<T> datas, string[] whereColumns);
Task<int> BulkMergeAsync(List<T> datas, string[] whereColumns, string[] updateColumns);
int BulkMerge(List<T> datas, string[] whereColumns, string[] updateColumns);
Task<int> BulkMergeAsync(List<T> datas, Expression<Func<T, object>> whereColumnsExp, Expression<Func<T, object>> updateColumnsExp);
int BulkMerge(List<T> datas, Expression<Func<T, object>> whereColumnsExp, Expression<Func<T, object>> updateColumnsExp);
}
}

View File

@@ -18,7 +18,65 @@ namespace SqlSugar
{
public class UtilMethods
{
public static bool IsArrayOrList(Type propertyType)
{
if (propertyType==null||propertyType == typeof(string))
return false;
var isList = propertyType.FullName.IsCollectionsList();
var isArray = propertyType.IsArray;
return isList || isArray;
}
public static object ConvertToArray(string input, Type targetType)
{
// 获取元素类型和集合类型
Type elementType;
bool isArray = targetType.IsArray;
bool isList = targetType.IsGenericType && targetType.GetGenericTypeDefinition() == typeof(List<>);
if (!isArray && !isList)
throw new ArgumentException("目标类型必须是数组或List类型");
elementType = isArray ? targetType.GetElementType() : targetType.GetGenericArguments()[0];
// 处理空输入
if (string.IsNullOrEmpty(input))
{
if (isArray)
return Array.CreateInstance(elementType, 0);
else
return Activator.CreateInstance(typeof(List<>).MakeGenericType(elementType));
}
// 解析输入字符串
var elements = input.Trim('[', ']').Split(',');
if (isArray)
{
// 处理数组
Array array = Array.CreateInstance(elementType, elements.Length);
for (int i = 0; i < elements.Length; i++)
{
string element = elements[i]?.Trim()?.TrimStart('"')?.TrimEnd('"');
array.SetValue(UtilMethods.ChangeType2(element, elementType), i);
}
return array;
}
else
{
// 处理List
var list = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(elementType));
for (int i = 0; i < elements.Length; i++)
{
string element = elements[i]?.Trim()?.TrimStart('"')?.TrimEnd('"');
list.Add(UtilMethods.ChangeType2(element, elementType));
}
return list;
}
}
internal static DbType? GetDatabaseType(ExpressionContext context)
{
return context?.SugarContext?.Context?.CurrentConnectionConfig?.DbType;
}
internal static void SetDefaultValueForBoolean(EntityColumnInfo item, Type propertyType)
{
if (propertyType == UtilConstants.BoolType && item.DefaultValue != null && item.DefaultValue.EqualCase("true"))