UpdateableProvider.cs 51 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.Linq;
  5. using System.Linq.Expressions;
  6. using System.Text;
  7. using System.Text.RegularExpressions;
  8. using System.Threading;
  9. using System.Threading.Tasks;
  10. namespace SqlSugar
  11. {
  12. public partial class UpdateableProvider<T> : IUpdateable<T> where T : class, new()
  13. {
  14. #region Property
  15. public SqlSugarProvider Context { get; internal set; }
  16. public EntityInfo EntityInfo { get; internal set; }
  17. public ISqlBuilder SqlBuilder { get; internal set; }
  18. public UpdateBuilder UpdateBuilder { get; set; }
  19. public IAdo Ado { get { return Context.Ado; } }
  20. public T[] UpdateObjs { get; set; }
  21. /// <summary>
  22. /// true : by expression update
  23. /// false: by object update
  24. /// </summary>
  25. public bool UpdateParameterIsNull { get; set; }
  26. public bool IsMappingTable { get { return this.Context.MappingTables != null && this.Context.MappingTables.Any(); } }
  27. public bool IsMappingColumns { get { return this.Context.MappingColumns != null && this.Context.MappingColumns.Any(); } }
  28. public bool IsSingle { get { return this.UpdateObjs.Length == 1; } }
  29. public List<MappingColumn> MappingColumnList { get; set; }
  30. private List<string> IgnoreColumnNameList { get; set; }
  31. private List<string> WhereColumnList { get; set; }
  32. private bool IsWhereColumns { get; set; }
  33. private bool IsOffIdentity { get; set; }
  34. private bool IsVersionValidation { get; set; }
  35. public MappingTableList OldMappingTableList { get; set; }
  36. public bool IsAs { get; set; }
  37. public bool IsEnableDiffLogEvent { get; set; }
  38. public DiffLogModel diffModel { get; set; }
  39. internal Action RemoveCacheFunc { get; set; }
  40. private int SetColumnsIndex { get; set; }
  41. private List<DbColumnInfo> columns { get; set; }
  42. #endregion
  43. #region Core
  44. public virtual string ToSqlString()
  45. {
  46. var sqlObj = this.ToSql();
  47. var result = sqlObj.Key;
  48. if (result == null) return null;
  49. result = UtilMethods.GetSqlString(this.Context.CurrentConnectionConfig, sqlObj);
  50. return result;
  51. }
  52. public KeyValuePair<string, List<SugarParameter>> ToSql()
  53. {
  54. PreToSql();
  55. string sql = UpdateBuilder.ToSqlString();
  56. RestoreMapping();
  57. return new KeyValuePair<string, List<SugarParameter>>(sql, UpdateBuilder.Parameters);
  58. }
  59. public void AddQueue()
  60. {
  61. var sqlObj = this.ToSql();
  62. this.Context.Queues.Add(sqlObj.Key, sqlObj.Value);
  63. }
  64. public virtual int ExecuteCommandWithOptLockIF(bool? IsVersionValidation ,bool? IsOptLock=null)
  65. {
  66. if (IsOptLock==true)
  67. {
  68. return ExecuteCommandWithOptLock(IsVersionValidation??false);
  69. }
  70. else
  71. {
  72. return this.ExecuteCommand();
  73. }
  74. }
  75. public virtual int ExecuteCommandWithOptLock(bool IsVersionValidation=false)
  76. {
  77. Check.ExceptionEasy(UpdateObjs?.Length>1, " OptLock can only be used on a single object, and the argument cannot be List", "乐观锁只能用于单个对象,参数不能是List,如果是一对多操作请更新主表统一用主表验证");
  78. var updateData = UpdateObjs.FirstOrDefault();
  79. if (updateData == null) return 0;
  80. object oldValue = null;
  81. var name=_ExecuteCommandWithOptLock(updateData,ref oldValue);
  82. var result= this.ExecuteCommand();
  83. OptRollBack(result,updateData, oldValue, name);
  84. if (result == 0 && IsVersionValidation)
  85. {
  86. throw new VersionExceptions(string.Format("UpdateVersionValidation {0} Not the latest version ", name));
  87. }
  88. return result;
  89. }
  90. public virtual int ExecuteCommand()
  91. {
  92. //if (this.UpdateBuilder.UpdateColumns.HasValue())
  93. //{
  94. // var columns = this.UpdateBuilder.UpdateColumns;
  95. // this.UpdateBuilder.DbColumnInfoList = this.UpdateBuilder.DbColumnInfoList.Where(it => GetPrimaryKeys().Select(iit => iit.ToLower()).Contains(it.DbColumnName.ToLower()) || columns.Contains(it.PropertyName, StringComparer.OrdinalIgnoreCase)).ToList();
  96. //}
  97. if (this.IsTrakingDatas() || IsUpdateNullByList())
  98. {
  99. int trakRows = DatasTrackingExecommand();
  100. return trakRows;
  101. }
  102. string sql = _ExecuteCommand();
  103. if (this.UpdateBuilder.AppendWhere.HasValue())
  104. {
  105. sql += " AND "+ this.UpdateBuilder.AppendWhere;
  106. }
  107. if (string.IsNullOrEmpty(sql))
  108. {
  109. return 0;
  110. }
  111. var result = 0;
  112. if (sql != Environment.NewLine)
  113. {
  114. result = this.Ado.ExecuteCommand(sql, UpdateBuilder.Parameters == null ? null : UpdateBuilder.Parameters.ToArray());
  115. }
  116. After(sql);
  117. return result;
  118. }
  119. public bool ExecuteCommandHasChange()
  120. {
  121. return this.ExecuteCommand() > 0;
  122. }
  123. public virtual async Task<int> ExecuteCommandWithOptLockAsync(bool IsVersionValidation = false)
  124. {
  125. Check.ExceptionEasy(UpdateObjs?.Length > 1, " OptLock can only be used on a single object, and the argument cannot be List", "乐观锁只能用于单个对象,参数不能是List,如果是一对多操作请更新主表统一用主表验证");
  126. var updateData = UpdateObjs.FirstOrDefault();
  127. if (updateData == null) return 0;
  128. object oldValue = null;
  129. var name=_ExecuteCommandWithOptLock(updateData,ref oldValue);
  130. var result= await this.ExecuteCommandAsync();
  131. OptRollBack(result,updateData, oldValue, name);
  132. if (result == 0 && IsVersionValidation)
  133. {
  134. throw new VersionExceptions(string.Format("UpdateVersionValidation {0} Not the latest version ", name));
  135. }
  136. return result;
  137. }
  138. public Task<int> ExecuteCommandAsync(CancellationToken token)
  139. {
  140. this.Context.Ado.CancellationToken= token;
  141. return ExecuteCommandAsync();
  142. }
  143. public virtual async Task<int> ExecuteCommandAsync()
  144. {
  145. //if (this.UpdateBuilder.UpdateColumns.HasValue())
  146. //{
  147. // var columns = this.UpdateBuilder.UpdateColumns;
  148. // this.UpdateBuilder.DbColumnInfoList = this.UpdateBuilder.DbColumnInfoList.Where(it => GetPrimaryKeys().Select(iit => iit.ToLower()).Contains(it.DbColumnName.ToLower()) || columns.Contains(it.PropertyName, StringComparer.OrdinalIgnoreCase)).ToList();
  149. //}
  150. if (this.IsTrakingDatas()||IsUpdateNullByList())
  151. {
  152. int trakRows =await DatasTrackingExecommandAsync();
  153. return trakRows;
  154. }
  155. string sql = _ExecuteCommand();
  156. if (this.UpdateBuilder.AppendWhere.HasValue())
  157. {
  158. sql += " AND " + this.UpdateBuilder.AppendWhere;
  159. }
  160. if (string.IsNullOrEmpty(sql))
  161. {
  162. return 0;
  163. }
  164. var result = await this.Ado.ExecuteCommandAsync(sql, UpdateBuilder.Parameters == null ? null : UpdateBuilder.Parameters.ToArray());
  165. After(sql);
  166. return result;
  167. }
  168. public Task<bool> ExecuteCommandHasChangeAsync(CancellationToken token)
  169. {
  170. this.Context.Ado.CancellationToken= token;
  171. return ExecuteCommandHasChangeAsync();
  172. }
  173. public async Task<bool> ExecuteCommandHasChangeAsync()
  174. {
  175. return await this.ExecuteCommandAsync() > 0;
  176. }
  177. #endregion
  178. #region Common
  179. public UpdateablePage<T> PageSize(int pageSize)
  180. {
  181. ThrowUpdateByExpressionByMesage(" PageSize(num) ");
  182. UpdateablePage<T> result = new UpdateablePage<T>();
  183. result.PageSize = pageSize;
  184. result.Context = this.Context;
  185. result.DataList = this.UpdateObjs;
  186. result.TableName = this.UpdateBuilder.TableName;
  187. result.IsEnableDiffLogEvent = this.IsEnableDiffLogEvent;
  188. result.WhereColumnList = this.WhereColumnList?.ToArray();
  189. result.DiffModel = this.diffModel;
  190. if (this.UpdateBuilder.DbColumnInfoList.Any())
  191. result.UpdateColumns = this.UpdateBuilder.DbColumnInfoList.GroupBy(it => it.TableId).First().Select(it => it.DbColumnName).ToList();
  192. if(this.UpdateBuilder?.UpdateColumns?.Any()==true)
  193. result.UpdateColumns = this.UpdateBuilder.UpdateColumns;
  194. return result;
  195. }
  196. public IUpdateable<T, T2> InnerJoin<T2>(Expression<Func<T, T2, bool>> joinExpress)
  197. {
  198. UpdateableProvider<T, T2> result = new UpdateableProvider<T, T2>();
  199. result.updateableObj = this;
  200. var querybale=this.Context.Queryable<T>().LeftJoin<T2>(joinExpress);
  201. result.updateableObj.UpdateBuilder.JoinInfos = querybale.QueryBuilder.JoinQueryInfos;
  202. result.updateableObj.UpdateBuilder.ShortName = joinExpress.Parameters.FirstOrDefault()?.Name;
  203. return result;
  204. }
  205. public IUpdateable<T, T2> InnerJoin<T2>(Expression<Func<T, T2, bool>> joinExpress,string TableName)
  206. {
  207. UpdateableProvider<T, T2> result = new UpdateableProvider<T, T2>();
  208. result.updateableObj = this;
  209. var querybale = this.Context.Queryable<T>().LeftJoin<T2>(joinExpress);
  210. result.updateableObj.UpdateBuilder.JoinInfos = querybale.QueryBuilder.JoinQueryInfos;
  211. result.updateableObj.UpdateBuilder.ShortName = joinExpress.Parameters.FirstOrDefault()?.Name;
  212. result.updateableObj.UpdateBuilder.TableName = TableName;
  213. return result;
  214. }
  215. public IUpdateable<T> Clone()
  216. {
  217. this.Context.SugarActionType = SugarActionType.Update;
  218. var result = InstanceFactory.GetUpdateableProvider<T>(this.Context.CurrentConnectionConfig);
  219. var sqlBuilder = InstanceFactory.GetSqlbuilder(this.Context.CurrentConnectionConfig); ;
  220. result.Context = this.Context;
  221. result.EntityInfo = this.Context.EntityMaintenance.GetEntityInfo<T>();
  222. result.SqlBuilder = sqlBuilder;
  223. result.SqlBuilder.Context = this.Context;
  224. result.UpdateObjs = UpdateObjs;
  225. result.WhereColumnList= this.WhereColumnList;
  226. result.IsWhereColumns = this.IsWhereColumns;
  227. result.IgnoreColumnNameList= this.IgnoreColumnNameList;
  228. result.IsAs = this.IsAs;
  229. result.IsOffIdentity= this.IsOffIdentity;
  230. result.IsEnableDiffLogEvent= this.IsEnableDiffLogEvent;
  231. result.diffModel = this.diffModel;
  232. result.UpdateParameterIsNull= this.UpdateParameterIsNull;
  233. result.RemoveCacheFunc= this.RemoveCacheFunc;
  234. result.SetColumnsIndex = this.SetColumnsIndex;
  235. result.OldMappingTableList= this.OldMappingTableList;
  236. result.MappingColumnList= this.MappingColumnList;
  237. result.columns = this.columns.ToList();
  238. result.UpdateBuilder = InstanceFactory.GetUpdateBuilder(this.Context.CurrentConnectionConfig);
  239. result.UpdateBuilder.Builder = sqlBuilder;
  240. result.UpdateBuilder.LambdaExpressions = InstanceFactory.GetLambdaExpressions(this.Context.CurrentConnectionConfig);
  241. result.Context=this.Context;
  242. result.UpdateBuilder.DbColumnInfoList = this.UpdateBuilder.DbColumnInfoList.ToList();
  243. result.UpdateBuilder.TableName= this.UpdateBuilder.TableName;
  244. result.UpdateBuilder.WhereValues = this.UpdateBuilder?.WhereValues?.ToList();
  245. result.UpdateBuilder.Parameters= this.UpdateBuilder?.Parameters?.ToList();
  246. result.UpdateBuilder.IsListUpdate= this.UpdateBuilder.IsListUpdate;
  247. result.UpdateBuilder.IsWhereColumns= this.UpdateBuilder.IsWhereColumns;
  248. result.UpdateBuilder.WhereValues=this.UpdateBuilder?.WhereValues?.ToList();
  249. result.UpdateBuilder.IsNoUpdateDefaultValue = this.UpdateBuilder.IsNoUpdateDefaultValue;
  250. result.UpdateBuilder.IsNoUpdateNull= this.UpdateBuilder.IsNoUpdateNull;
  251. result.UpdateBuilder.SetValues= this.UpdateBuilder?.SetValues?.ToList();
  252. result.UpdateBuilder.UpdateColumns = this.UpdateBuilder?.UpdateColumns?.ToList();
  253. result.UpdateBuilder.Context = this.Context;
  254. return result;
  255. }
  256. public IUpdateable<T> With(string lockString)
  257. {
  258. if (this.Context.CurrentConnectionConfig.DbType == DbType.SqlServer)
  259. this.UpdateBuilder.TableWithString = lockString;
  260. return this;
  261. }
  262. public SplitTableUpdateProvider<T> SplitTable(Func<List<SplitTableInfo>, IEnumerable<SplitTableInfo>> getTableNamesFunc)
  263. {
  264. UtilMethods.StartCustomSplitTable(this.Context, typeof(T));
  265. this.Context.MappingTables.Add(this.EntityInfo.EntityName, this.EntityInfo.DbTableName);
  266. SplitTableUpdateProvider<T> result = new SplitTableUpdateProvider<T>();
  267. result.Context = this.Context;
  268. SplitTableContext helper = new SplitTableContext(Context)
  269. {
  270. EntityInfo = this.EntityInfo
  271. };
  272. var tables = getTableNamesFunc(helper.GetTables());
  273. result.Tables = tables;
  274. result.updateobj = this;
  275. return result;
  276. }
  277. public SplitTableUpdateByObjectProvider<T> SplitTable()
  278. {
  279. UtilMethods.StartCustomSplitTable(this.Context, typeof(T));
  280. Check.ExceptionEasy(UpdateParameterIsNull, "SplitTable() not supported db.Updateable<T>(),use db.Updateable(list)", ".SplitTable()不支持 db.Updateable<T>()方式更新,请使用 db.Updateable(list) 对象方式更新, 或者使用 .SplitTable(+1)重载");
  281. SplitTableUpdateByObjectProvider<T> result = new SplitTableUpdateByObjectProvider<T>();
  282. result.Context = this.Context;
  283. result.UpdateObjects = this.UpdateObjs;
  284. SplitTableContext helper = new SplitTableContext(Context)
  285. {
  286. EntityInfo = this.EntityInfo
  287. };
  288. result.updateobj = this;
  289. return result;
  290. }
  291. public IUpdateable<T> RemoveDataCache()
  292. {
  293. this.RemoveCacheFunc = () =>
  294. {
  295. var cacheService = this.Context.CurrentConnectionConfig.ConfigureExternalServices.DataInfoCacheService;
  296. CacheSchemeMain.RemoveCache(cacheService, this.Context.EntityMaintenance.GetTableName<T>());
  297. };
  298. return this;
  299. }
  300. public IUpdateable<T> RemoveDataCache(string likeString)
  301. {
  302. this.RemoveCacheFunc = () =>
  303. {
  304. var cacheService = this.Context.CurrentConnectionConfig.ConfigureExternalServices.DataInfoCacheService;
  305. CacheSchemeMain.RemoveCacheByLike(cacheService, likeString);
  306. };
  307. return this;
  308. }
  309. public IUpdateable<T> IsEnableUpdateVersionValidation()
  310. {
  311. this.IsVersionValidation = true;
  312. return this;
  313. }
  314. public IUpdateable<T> AsType(Type tableNameType)
  315. {
  316. return AS(this.Context.EntityMaintenance.GetEntityInfo(tableNameType).DbTableName);
  317. }
  318. public IUpdateable<T> AS(string tableName)
  319. {
  320. //if (tableName == null) return this;
  321. //var entityName = typeof(T).Name;
  322. //IsAs = true;
  323. //OldMappingTableList = this.Context.MappingTables;
  324. //this.Context.MappingTables = this.Context.Utilities.TranslateCopy(this.Context.MappingTables);
  325. //if (this.Context.MappingTables.Any(it => it.EntityName == entityName))
  326. //{
  327. // this.Context.MappingTables.Add(this.Context.MappingTables.First(it => it.EntityName == entityName).DbTableName, tableName);
  328. //}
  329. //this.Context.MappingTables.Add(entityName, tableName);
  330. this.UpdateBuilder.TableName = tableName;
  331. if (tableName.IsNullOrEmpty())
  332. this.UpdateBuilder.TableName = this.EntityInfo.DbTableName;
  333. return this; ;
  334. }
  335. public IUpdateable<T> EnableDiffLogEventIF(bool isEnableDiffLog, object businessData = null)
  336. {
  337. if (isEnableDiffLog)
  338. {
  339. return EnableDiffLogEvent(businessData);
  340. }
  341. return this;
  342. }
  343. public IUpdateable<T> EnableDiffLogEvent(object businessData = null)
  344. {
  345. //Check.Exception(this.UpdateObjs.HasValue() && this.UpdateObjs.Count() > 1, "DiffLog does not support batch operations");
  346. diffModel = new DiffLogModel();
  347. this.IsEnableDiffLogEvent = true;
  348. diffModel.BusinessData = businessData;
  349. diffModel.DiffType = DiffType.update;
  350. return this;
  351. }
  352. public IUpdateable<T> IgnoreColumns(bool ignoreAllNullColumns, bool isOffIdentity = false, bool ignoreAllDefaultValue = false)
  353. {
  354. //Check.Exception(this.UpdateObjs.Count() > 1 && ignoreAllNullColumns, ErrorMessage.GetThrowMessage("ignoreNullColumn NoSupport batch insert", "ignoreNullColumn 不支持批量操作"));
  355. UpdateBuilder.IsOffIdentity = isOffIdentity;
  356. if (this.UpdateBuilder.LambdaExpressions == null)
  357. this.UpdateBuilder.LambdaExpressions = InstanceFactory.GetLambdaExpressions(this.Context.CurrentConnectionConfig);
  358. this.UpdateBuilder.IsNoUpdateNull = ignoreAllNullColumns;
  359. this.UpdateBuilder.IsNoUpdateDefaultValue = ignoreAllDefaultValue;
  360. return this;
  361. }
  362. public IUpdateable<T> IgnoreColumns(Expression<Func<T, object>> columns)
  363. {
  364. var ignoreColumns = UpdateBuilder.GetExpressionValue(columns, ResolveExpressType.ArraySingle).GetResultArray().Select(it => this.SqlBuilder.GetNoTranslationColumnName(it).ToLower()).ToList();
  365. this.UpdateBuilder.DbColumnInfoList = this.UpdateBuilder.DbColumnInfoList.Where(it => !ignoreColumns.Contains(it.PropertyName.ToLower())).ToList();
  366. this.UpdateBuilder.DbColumnInfoList = this.UpdateBuilder.DbColumnInfoList.Where(it => !ignoreColumns.Contains(it.DbColumnName.ToLower())).ToList();
  367. return this;
  368. }
  369. public IUpdateable<T> IgnoreColumnsIF(bool IsIgnore, Expression<Func<T, object>> columns)
  370. {
  371. if (IsIgnore) this.IgnoreColumns(columns);
  372. return this;
  373. }
  374. public IUpdateable<T> IgnoreNullColumns(bool isIgnoreNull = true)
  375. {
  376. if (isIgnoreNull)
  377. {
  378. return IgnoreColumns(isIgnoreNull);
  379. }
  380. else
  381. {
  382. return this;
  383. }
  384. }
  385. public IUpdateable<T> IgnoreColumns(string[] columns)
  386. {
  387. if (columns.HasValue())
  388. {
  389. var ignoreColumns = columns.Select(it => it.ToLower()).ToList();
  390. this.UpdateBuilder.DbColumnInfoList = this.UpdateBuilder.DbColumnInfoList.Where(it => !ignoreColumns.Contains(it.PropertyName.ToLower())).ToList();
  391. this.UpdateBuilder.DbColumnInfoList = this.UpdateBuilder.DbColumnInfoList.Where(it => !ignoreColumns.Contains(it.DbColumnName.ToLower())).ToList();
  392. }
  393. return this;
  394. }
  395. public IUpdateable<T> ReSetValue(Action<T> setValueExpression)
  396. {
  397. ThrowUpdateByExpression();
  398. if (this.UpdateObjs.HasValue())
  399. {
  400. var oldColumns = this.UpdateBuilder.DbColumnInfoList.Select(it => it.PropertyName).ToList();
  401. foreach (var item in UpdateObjs)
  402. {
  403. setValueExpression(item);
  404. }
  405. this.UpdateBuilder.DbColumnInfoList = new List<DbColumnInfo>();
  406. Init();
  407. this.UpdateBuilder.DbColumnInfoList = this.UpdateBuilder.DbColumnInfoList.Where(it => oldColumns.Contains(it.PropertyName)).ToList();
  408. }
  409. return this;
  410. }
  411. public IUpdateable<T> PublicSetColumns(Expression<Func<T, object>> filedNameExpression, string computationalSymbol)
  412. {
  413. if (UpdateParameterIsNull == true)
  414. {
  415. Check.Exception(UpdateParameterIsNull == true, ErrorMessage.GetThrowMessage("The PublicSetColumns(exp,string) overload can only be used to update entity objects: db.Updateable(object)", "PublicSetColumns(exp,string)重载只能用在实体对象更新:db.Updateable(对象),请区分表达式更新和实体对象更不同用法 "));
  416. }
  417. else
  418. {
  419. var name = ExpressionTool.GetMemberName(filedNameExpression);
  420. if (name == null)
  421. {
  422. Check.ExceptionEasy(filedNameExpression + " format error ", filedNameExpression + "参数格式错误");
  423. }
  424. //var value = this.UpdateBuilder.GetExpressionValue(ValueExpExpression, ResolveExpressType.WhereSingle).GetResultString();
  425. if (this.UpdateBuilder.ReSetValueBySqlExpList == null)
  426. {
  427. this.UpdateBuilder.ReSetValueBySqlExpList = new Dictionary<string, ReSetValueBySqlExpListModel>();
  428. }
  429. if (!this.UpdateBuilder.ReSetValueBySqlExpList.ContainsKey(name))
  430. {
  431. this.UpdateBuilder.ReSetValueBySqlExpList.Add(name, new ReSetValueBySqlExpListModel()
  432. {
  433. Type= ReSetValueBySqlExpListModelType.List,
  434. Sql = computationalSymbol,
  435. DbColumnName = this.SqlBuilder.GetTranslationColumnName(this.EntityInfo.Columns.First(it => it.PropertyName == name).DbColumnName)
  436. });
  437. }
  438. }
  439. return this;
  440. }
  441. public IUpdateable<T> PublicSetColumns(Expression<Func<T, object>> filedNameExpression, Expression<Func<T, object>> ValueExpExpression)
  442. {
  443. if (UpdateParameterIsNull == true)
  444. {
  445. return SetColumns(filedNameExpression, ValueExpExpression);
  446. }
  447. else
  448. {
  449. var name = ExpressionTool.GetMemberName(filedNameExpression);
  450. if (name == null)
  451. {
  452. Check.ExceptionEasy(filedNameExpression + " format error ", filedNameExpression + "参数格式错误");
  453. }
  454. var value = this.UpdateBuilder.GetExpressionValue(ValueExpExpression, ResolveExpressType.WhereSingle).GetResultString();
  455. if (this.UpdateBuilder.ReSetValueBySqlExpList == null)
  456. {
  457. this.UpdateBuilder.ReSetValueBySqlExpList = new Dictionary<string, ReSetValueBySqlExpListModel>();
  458. }
  459. if (!this.UpdateBuilder.ReSetValueBySqlExpList.ContainsKey(name))
  460. {
  461. this.UpdateBuilder.ReSetValueBySqlExpList.Add(name, new ReSetValueBySqlExpListModel()
  462. {
  463. Sql = value,
  464. DbColumnName =this.SqlBuilder.GetTranslationColumnName(this.EntityInfo.Columns.First(it => it.PropertyName == name).DbColumnName)
  465. }); ;
  466. }
  467. }
  468. return this;
  469. }
  470. #endregion
  471. #region Update by object
  472. public IUpdateable<T> CallEntityMethod(Expression<Action<T>> method)
  473. {
  474. ThrowUpdateByExpression();
  475. if (this.UpdateObjs.HasValue())
  476. {
  477. var oldColumns = this.UpdateBuilder.DbColumnInfoList.Select(it => it.PropertyName).ToList();
  478. var expression = (LambdaExpression.Lambda(method).Body as LambdaExpression).Body;
  479. Check.Exception(!(expression is MethodCallExpression), method.ToString() + " is not method");
  480. var callExpresion = expression as MethodCallExpression;
  481. UtilMethods.DataInoveByExpresson(this.UpdateObjs, callExpresion);
  482. this.UpdateBuilder.DbColumnInfoList = new List<DbColumnInfo>();
  483. Init();
  484. this.UpdateBuilder.DbColumnInfoList = this.UpdateBuilder.DbColumnInfoList.Where(it => oldColumns.Contains(it.PropertyName)).ToList();
  485. }
  486. return this;
  487. }
  488. public IUpdateable<T> WhereColumns(Expression<Func<T, object>> columns)
  489. {
  490. ThrowUpdateByExpression();
  491. this.IsWhereColumns = true;
  492. UpdateBuilder.IsWhereColumns = true;
  493. Check.Exception(UpdateParameterIsNull == true, "Updateable<T>().Updateable is error,Use Updateable(obj).WhereColumns");
  494. var whereColumns = UpdateBuilder.GetExpressionValue(columns, ResolveExpressType.ArraySingle).GetResultArray().Select(it => this.SqlBuilder.GetNoTranslationColumnName(it)).ToList();
  495. if (this.WhereColumnList == null) this.WhereColumnList = new List<string>();
  496. foreach (var item in whereColumns)
  497. {
  498. _WhereColumn(item);
  499. var columnInfo=this.EntityInfo.Columns.FirstOrDefault(it => it.PropertyName.EqualCase(item));
  500. if (columnInfo != null)
  501. {
  502. this.WhereColumnList.Add(columnInfo.DbColumnName);
  503. }
  504. else
  505. {
  506. this.WhereColumnList.Add(item);
  507. }
  508. }
  509. return this;
  510. }
  511. public IUpdateable<T> WhereColumns(string columnName)
  512. {
  513. ThrowUpdateByExpression();
  514. if (this.WhereColumnList == null) this.WhereColumnList = new List<string>();
  515. _WhereColumn(columnName);
  516. this.WhereColumnList.Add(columnName);
  517. return this;
  518. }
  519. public IUpdateable<T> WhereColumns(string[] columnNames)
  520. {
  521. if (columnNames == null) return this;
  522. ThrowUpdateByExpression();
  523. if (this.WhereColumnList == null) this.WhereColumnList = new List<string>();
  524. foreach (var columnName in columnNames)
  525. {
  526. _WhereColumn(columnName);
  527. this.WhereColumnList.Add(columnName);
  528. }
  529. return this;
  530. }
  531. public IUpdateable<T> UpdateColumns(Expression<Func<T, object>> columns, bool appendColumnsByDataFilter)
  532. {
  533. ThrowUpdateByExpression();
  534. var updateColumns = UpdateBuilder.GetExpressionValue(columns, ResolveExpressType.ArraySingle).GetResultArray().Select(it => this.SqlBuilder.GetNoTranslationColumnName(it)).ToList();
  535. return UpdateColumns(updateColumns.ToArray(), appendColumnsByDataFilter);
  536. }
  537. public IUpdateable<T> UpdateColumns(Expression<Func<T, object>> columns)
  538. {
  539. ThrowUpdateByExpression();
  540. var updateColumns = UpdateBuilder.GetExpressionValue(columns, ResolveExpressType.ArraySingle).GetResultArray().Select(it => this.SqlBuilder.GetNoTranslationColumnName(it)).ToList();
  541. if (this.UpdateBuilder.UpdateColumns == null)
  542. {
  543. this.UpdateBuilder.UpdateColumns = new List<string>();
  544. }
  545. this.UpdateBuilder.UpdateColumns.AddRange(updateColumns);
  546. //List<string> primaryKeys = GetPrimaryKeys();
  547. //foreach (var item in this.UpdateBuilder.DbColumnInfoList)
  548. //{
  549. // var mappingInfo = primaryKeys.SingleOrDefault(i => item.DbColumnName.Equals(i, StringComparison.CurrentCultureIgnoreCase));
  550. // if (mappingInfo != null && mappingInfo.Any())
  551. // {
  552. // item.IsPrimarykey = true;
  553. // }
  554. //}
  555. //this.UpdateBuilder.DbColumnInfoList = this.UpdateBuilder.DbColumnInfoList.Where(it => updateColumns.Any(uc => uc.Equals(it.PropertyName, StringComparison.CurrentCultureIgnoreCase) || uc.Equals(it.DbColumnName, StringComparison.CurrentCultureIgnoreCase)) || it.IsPrimarykey || it.IsIdentity).ToList();
  556. return this;
  557. }
  558. public IUpdateable<T> UpdateColumns(string[] columns, bool appendColumnsByDataFilter)
  559. {
  560. List<string> updateColumns = new List<string>();
  561. if (appendColumnsByDataFilter)
  562. {
  563. var newData = new T() { };
  564. UtilMethods.ClearPublicProperties(newData, this.EntityInfo);
  565. var data = ((UpdateableProvider<T>)this.Context.Updateable(newData)).UpdateObjs.First();
  566. foreach (var item in this.EntityInfo.Columns.Where(it => !it.IsPrimarykey && !it.IsIgnore && !it.IsOnlyIgnoreUpdate))
  567. {
  568. var value = item.PropertyInfo.GetValue(data);
  569. if (value != null && !value.Equals(""))
  570. {
  571. if (!value.Equals(UtilMethods.GetDefaultValue(item.UnderType)))
  572. {
  573. updateColumns.Add(item.PropertyName);
  574. }
  575. }
  576. }
  577. }
  578. updateColumns.AddRange(columns);
  579. return UpdateColumns(updateColumns.ToArray());
  580. }
  581. public IUpdateable<T> UpdateColumns(string[] columns)
  582. {
  583. if (columns == null||columns.Length==0) return this;
  584. ThrowUpdateByExpression();
  585. if (this.UpdateBuilder.UpdateColumns == null)
  586. {
  587. this.UpdateBuilder.UpdateColumns = new List<string>();
  588. }
  589. this.UpdateBuilder.UpdateColumns.AddRange(columns);
  590. //if (columns.HasValue())
  591. //{
  592. // //this.UpdateBuilder.DbColumnInfoList = this.UpdateBuilder.DbColumnInfoList.Where(it => GetPrimaryKeys().Select(iit => iit.ToLower()).Contains(it.DbColumnName.ToLower()) || columns.Contains(it.PropertyName, StringComparer.OrdinalIgnoreCase)).ToList();
  593. //}
  594. return this;
  595. }
  596. public IUpdateable<T> UpdateColumnsIF(bool isUpdateColumns, Expression<Func<T, object>> columns)
  597. {
  598. ThrowUpdateByExpression();
  599. if (isUpdateColumns)
  600. UpdateColumns(columns);
  601. return this;
  602. }
  603. public IUpdateable<T> UpdateColumnsIF(bool isUpdateColumns, string[] columns)
  604. {
  605. ThrowUpdateByExpression();
  606. if (isUpdateColumns)
  607. UpdateColumns(columns);
  608. return this;
  609. }
  610. #endregion
  611. #region Update by expression
  612. public IUpdateable<T> EnableQueryFilter()
  613. {
  614. try
  615. {
  616. ThrowUpdateByObject();
  617. }
  618. catch
  619. {
  620. Check.ExceptionEasy("Updateable<T>(obj) no support, use Updateable<T>().SetColumn ", "更新过滤器只能用在表达式方式更新 ,更新分为实体更新和表达式更新 。正确用法 Updateable<T>().SetColum(..).Where(..)");
  621. }
  622. var queryable = this.Context.Queryable<T>();
  623. queryable.QueryBuilder.LambdaExpressions.ParameterIndex = 1000;
  624. var sqlable = queryable.ToSql();
  625. var whereInfos = Regex.Split(sqlable.Key, " Where ", RegexOptions.IgnoreCase);
  626. if (whereInfos.Length > 1)
  627. {
  628. this.Where(whereInfos.Last(), sqlable.Value);
  629. }
  630. return this;
  631. }
  632. public IUpdateable<T> SetColumns(string fieldName, object fieldValue)
  633. {
  634. ThrowUpdateByObject();
  635. var columnInfo = this.EntityInfo.Columns.FirstOrDefault(it => it.PropertyName.EqualCase(fieldName));
  636. if (columnInfo != null)
  637. {
  638. fieldName = columnInfo.DbColumnName;
  639. }
  640. var parameterName =this.SqlBuilder.SqlParameterKeyWord+ "Const" + this.UpdateBuilder.LambdaExpressions.ParameterIndex;
  641. this.UpdateBuilder.LambdaExpressions.ParameterIndex = this.UpdateBuilder.LambdaExpressions.ParameterIndex+1;
  642. if (UpdateBuilder.Parameters == null)
  643. {
  644. UpdateBuilder.Parameters = new List<SugarParameter>();
  645. }
  646. UpdateBuilder.Parameters.Add(new SugarParameter(parameterName, fieldValue));
  647. if (columnInfo?.UpdateServerTime == true)
  648. {
  649. var nowTime= this.Context.Queryable<object>().QueryBuilder.LambdaExpressions.DbMehtods.GetDate();
  650. UpdateBuilder.SetValues.Add(new KeyValuePair<string, string>(SqlBuilder.GetTranslationColumnName(fieldName), $"{SqlBuilder.GetTranslationColumnName(fieldName)}={nowTime}"));
  651. }
  652. else
  653. {
  654. UpdateBuilder.SetValues.Add(new KeyValuePair<string, string>(SqlBuilder.GetTranslationColumnName(fieldName), $"{SqlBuilder.GetTranslationColumnName(fieldName)}={parameterName}"));
  655. }
  656. this.UpdateBuilder.DbColumnInfoList = this.UpdateBuilder.DbColumnInfoList.Where(it => (UpdateParameterIsNull == false && IsPrimaryKey(it)) || UpdateBuilder.SetValues.Any(v => SqlBuilder.GetNoTranslationColumnName(v.Key).Equals(it.DbColumnName, StringComparison.CurrentCultureIgnoreCase) || SqlBuilder.GetNoTranslationColumnName(v.Key).Equals(it.PropertyName, StringComparison.CurrentCultureIgnoreCase)) || it.IsPrimarykey == true).ToList();
  657. if (!this.UpdateBuilder.DbColumnInfoList.Any(it => it.DbColumnName.EqualCase(fieldName)))
  658. {
  659. this.UpdateBuilder.DbColumnInfoList.Add(new DbColumnInfo()
  660. {
  661. DbColumnName=fieldName,
  662. Value=fieldValue,
  663. PropertyName=fieldName,
  664. PropertyType=fieldValue?.GetType()
  665. });
  666. }
  667. AppendSets();
  668. return this;
  669. }
  670. public IUpdateable<T> SetColumnsIF(bool isUpdateColumns, Expression<Func<T, object>> filedNameExpression, object fieldValue)
  671. {
  672. if (isUpdateColumns)
  673. {
  674. return SetColumns(filedNameExpression, fieldValue);
  675. }
  676. else
  677. {
  678. return this;
  679. }
  680. }
  681. public IUpdateable<T> SetColumns(Expression<Func<T, object>> filedNameExpression, Expression<Func<T, object>> valueExpression)
  682. {
  683. if (valueExpression == null)
  684. {
  685. return SetColumns(filedNameExpression,(object)null);
  686. }
  687. var name = UpdateBuilder.GetExpressionValue(filedNameExpression, ResolveExpressType.FieldSingle).GetString();
  688. name = UpdateBuilder.Builder.GetTranslationColumnName(name);
  689. var exp = ExpressionTool.RemoveConvert((valueExpression as LambdaExpression).Body);
  690. var value = UpdateBuilder.GetExpressionValue(exp, ResolveExpressType.WhereSingle).GetString();
  691. value = $" {name}={value} ";
  692. this.UpdateBuilder.SetValues.Add(new KeyValuePair<string, string>(name,value));
  693. this.UpdateBuilder.DbColumnInfoList = this.UpdateBuilder.DbColumnInfoList.Where(it => (UpdateParameterIsNull == false && IsPrimaryKey(it)) || UpdateBuilder.SetValues.Any(v => SqlBuilder.GetNoTranslationColumnName(v.Key).Equals(it.DbColumnName, StringComparison.CurrentCultureIgnoreCase) || SqlBuilder.GetNoTranslationColumnName(v.Key).Equals(it.PropertyName, StringComparison.CurrentCultureIgnoreCase)) || it.IsPrimarykey == true).ToList();
  694. AppendSets();
  695. if (typeof(T) == UtilConstants.ObjType)
  696. {
  697. this.UpdateBuilder.DbColumnInfoList.Add(new DbColumnInfo()
  698. {
  699. DbColumnName = UpdateBuilder.Builder.GetNoTranslationColumnName(name),
  700. Value = value,
  701. PropertyName = name,
  702. SqlParameterDbType = typeof(SqlSugar.DbConvert.NoParameterCommonPropertyConvert)
  703. });
  704. }
  705. return this;
  706. }
  707. public IUpdateable<T> SetColumns(Expression<Func<T, object>> filedNameExpression, object fieldValue)
  708. {
  709. var name= UpdateBuilder.GetExpressionValue(filedNameExpression,ResolveExpressType.FieldSingle).GetString();
  710. name = UpdateBuilder.Builder.GetNoTranslationColumnName(name);
  711. return SetColumns(name, fieldValue);
  712. }
  713. public IUpdateable<T> SetColumns(Expression<Func<T, T>> columns)
  714. {
  715. ThrowUpdateByObject();
  716. var expResult = UpdateBuilder.GetExpressionValue(columns, ResolveExpressType.Update);
  717. var resultArray = expResult.GetResultArray();
  718. Check.ArgumentNullException(resultArray, "UpdateColumns Parameter error, UpdateColumns(it=>new T{ it.id=1}) is valid, UpdateColumns(it=>T) is error");
  719. var keys= ExpressionTool.GetNewExpressionItemList(columns).ToArray();
  720. if (resultArray.HasValue())
  721. {
  722. int i = 0;
  723. foreach (var item in resultArray)
  724. {
  725. string key = key = keys[i].Key;
  726. i++;
  727. var value = item;
  728. if (value.Contains("= \"SYSDATE\""))
  729. {
  730. value = value.Replace("= \"SYSDATE\"", "= SYSDATE");
  731. }
  732. UpdateBuilder.SetValues.Add(new KeyValuePair<string, string>(SqlBuilder.GetTranslationColumnName(key), value));
  733. }
  734. }
  735. this.UpdateBuilder.DbColumnInfoList = UpdateBuilder.DbColumnInfoList.Where(it =>it.UpdateServerTime==true||it.UpdateSql.HasValue()|| (UpdateParameterIsNull == false && IsPrimaryKey(it)) || UpdateBuilder.SetValues.Any(v => SqlBuilder.GetNoTranslationColumnName(v.Key).Equals(it.DbColumnName, StringComparison.CurrentCultureIgnoreCase) || SqlBuilder.GetNoTranslationColumnName(v.Key).Equals(it.PropertyName, StringComparison.CurrentCultureIgnoreCase)) || it.IsPrimarykey == true).ToList();
  736. CheckTranscodeing(false);
  737. AppendSets();
  738. return this;
  739. }
  740. public IUpdateable<T> SetColumns(Expression<Func<T, T>> columns, bool appendColumnsByDataFilter)
  741. {
  742. ThrowUpdateByObject();
  743. var expResult = UpdateBuilder.GetExpressionValue(columns, ResolveExpressType.Update);
  744. var resultArray = expResult.GetResultArray();
  745. Check.ArgumentNullException(resultArray, "UpdateColumns Parameter error, UpdateColumns(it=>new T{ it.id=1}) is valid, UpdateColumns(it=>T) is error");
  746. if (resultArray.HasValue())
  747. {
  748. foreach (var item in resultArray)
  749. {
  750. string key = SqlBuilder.GetNoTranslationColumnName(item);
  751. var value = item;
  752. if (value.Contains("= \"SYSDATE\""))
  753. {
  754. value = value.Replace("= \"SYSDATE\"", "= SYSDATE");
  755. }
  756. UpdateBuilder.SetValues.Add(new KeyValuePair<string, string>(SqlBuilder.GetTranslationColumnName(key), value));
  757. }
  758. }
  759. if (appendColumnsByDataFilter)
  760. {
  761. var newData = new T() { };
  762. UtilMethods.ClearPublicProperties(newData, this.EntityInfo);
  763. var data = ((UpdateableProvider<T>)this.Context.Updateable(newData)).UpdateObjs.First();
  764. foreach (var item in this.EntityInfo.Columns.Where(it => !it.IsPrimarykey && !it.IsIgnore && !it.IsOnlyIgnoreUpdate))
  765. {
  766. var value = item.PropertyInfo.GetValue(data);
  767. if (value != null && !value.Equals(""))
  768. {
  769. if (!value.Equals(UtilMethods.GetDefaultValue(item.UnderType)))
  770. {
  771. var pName = this.SqlBuilder.SqlParameterKeyWord + item.PropertyName + 1000;
  772. var p = new SugarParameter(pName, value);
  773. this.UpdateBuilder.Parameters.Add(p);
  774. UpdateBuilder.SetValues.Add(new KeyValuePair<string, string>(SqlBuilder.GetTranslationColumnName(item.DbColumnName), SqlBuilder.GetTranslationColumnName(item.DbColumnName)+"="+pName));
  775. }
  776. }
  777. }
  778. }
  779. if (this.EntityInfo.Columns.Any(it => it.UpdateServerTime || it.UpdateSql.HasValue()))
  780. {
  781. var appendColumns = this.EntityInfo.Columns.Where(it => it.UpdateServerTime || it.UpdateSql.HasValue());
  782. foreach (var item in appendColumns)
  783. {
  784. if (item.UpdateServerTime)
  785. {
  786. UpdateBuilder.SetValues.Add(new KeyValuePair<string, string>(SqlBuilder.GetTranslationColumnName(item.DbColumnName), SqlBuilder.GetTranslationColumnName(item.DbColumnName) + "=" + UpdateBuilder.LambdaExpressions.DbMehtods.GetDate()));
  787. }
  788. else if (item.UpdateSql.HasValue())
  789. {
  790. UpdateBuilder.SetValues.Add(new KeyValuePair<string, string>(SqlBuilder.GetTranslationColumnName(item.DbColumnName), SqlBuilder.GetTranslationColumnName(item.DbColumnName) + "=" + item.UpdateSql));
  791. }
  792. }
  793. }
  794. this.UpdateBuilder.DbColumnInfoList = UpdateBuilder.DbColumnInfoList.Where(it =>it.UpdateServerTime||it.UpdateSql.HasValue()|| (UpdateParameterIsNull == false && IsPrimaryKey(it)) || UpdateBuilder.SetValues.Any(v => SqlBuilder.GetNoTranslationColumnName(v.Key).Equals(it.DbColumnName, StringComparison.CurrentCultureIgnoreCase) || SqlBuilder.GetNoTranslationColumnName(v.Key).Equals(it.PropertyName, StringComparison.CurrentCultureIgnoreCase)) || it.IsPrimarykey == true).ToList();
  795. CheckTranscodeing(false);
  796. AppendSets();
  797. return this;
  798. }
  799. public IUpdateable<T> SetColumns(Expression<Func<T, bool>> columns)
  800. {
  801. ThrowUpdateByObject();
  802. var binaryExp = columns.Body as BinaryExpression;
  803. Check.Exception(!binaryExp.NodeType.IsIn(ExpressionType.Equal), "No support {0}", columns.ToString());
  804. Check.Exception(!(binaryExp.Left is MemberExpression) && !(binaryExp.Left is UnaryExpression), "No support {0}", columns.ToString());
  805. Check.Exception(ExpressionTool.IsConstExpression(binaryExp.Left as MemberExpression), "No support {0}", columns.ToString());
  806. if (UpdateBuilder.LambdaExpressions.ParameterIndex <= 1&&
  807. this.EntityInfo.Columns
  808. .Select(it=>it.PropertyName.TrimEnd('2'))
  809. .GroupBy(it=>it)
  810. .Any(it=>it.Count()>1)
  811. )
  812. {
  813. UpdateBuilder.LambdaExpressions.ParameterIndex = 100;
  814. }
  815. var expResult = UpdateBuilder.GetExpressionValue(columns, ResolveExpressType.WhereSingle).GetResultString().Replace(")", " )").Replace("(", "( ").Trim().TrimStart('(').TrimEnd(')').Replace("= =","=");
  816. if (expResult.EndsWith(" IS NULL "))
  817. {
  818. expResult = Regex.Split(expResult, " IS NULL ")[0]+" = NULL ";
  819. }
  820. else if (!expResult.Contains("=")&&expResult.Contains("IS NULL "))
  821. {
  822. expResult = Regex.Split(expResult, "IS NULL ")[0] + " = NULL ";
  823. }
  824. string key = SqlBuilder.GetNoTranslationColumnName(expResult);
  825. if (EntityInfo.Columns.Where(it=>it.IsJson||it.IsTranscoding).Any(it => it.DbColumnName.EqualCase(key) || it.PropertyName.EqualCase(key)))
  826. {
  827. CheckTranscodeing();
  828. }
  829. if (columns.ToString().Contains("Subqueryable()."))
  830. {
  831. expResult= expResult.Replace(this.SqlBuilder.GetTranslationColumnName((ExpressionTool.RemoveConvert(binaryExp.Left) as MemberExpression).Expression+"") +".",this.UpdateBuilder.GetTableNameString.TrimEnd()+".");
  832. }
  833. UpdateBuilder.SetValues.Add(new KeyValuePair<string, string>(SqlBuilder.GetTranslationColumnName(key), expResult));
  834. this.UpdateBuilder.DbColumnInfoList = this.UpdateBuilder.DbColumnInfoList.Where(it => (UpdateParameterIsNull == false && IsPrimaryKey(it)) || UpdateBuilder.SetValues.Any(v => SqlBuilder.GetNoTranslationColumnName(v.Key).Equals(it.DbColumnName, StringComparison.CurrentCultureIgnoreCase) || SqlBuilder.GetNoTranslationColumnName(v.Key).Equals(it.PropertyName, StringComparison.CurrentCultureIgnoreCase)) || it.IsPrimarykey == true).ToList();
  835. AppendSets();
  836. return this;
  837. }
  838. public IUpdateable<T> SetColumnsIF(bool isUpdateColumns, Expression<Func<T, bool>> columns)
  839. {
  840. ThrowUpdateByObject();
  841. if (isUpdateColumns)
  842. SetColumns(columns);
  843. return this;
  844. }
  845. public IUpdateable<T> SetColumnsIF(bool isUpdateColumns, Expression<Func<T, T>> columns)
  846. {
  847. ThrowUpdateByObject();
  848. if (isUpdateColumns)
  849. SetColumns(columns);
  850. return this;
  851. }
  852. public IUpdateable<T> In<PkType>(Expression<Func<T, object>> inField, ISugarQueryable<PkType> childQueryExpression)
  853. {
  854. var lamResult = UpdateBuilder.GetExpressionValue(inField, ResolveExpressType.FieldSingle);
  855. this.UpdateBuilder.LambdaExpressions.ParameterIndex = childQueryExpression.QueryBuilder.LambdaExpressions.ParameterIndex+1;
  856. var fieldName = lamResult.GetResultString();
  857. if (!this.UpdateBuilder.SetValues.Any())
  858. {
  859. var sql = childQueryExpression.ToSql();
  860. Where($" {fieldName} IN ( SELECT {fieldName} FROM ( {sql.Key} ) SUBDEL) ", sql.Value);
  861. }
  862. else
  863. {
  864. Where($" {fieldName} IN ( SELECT {fieldName} FROM ( {childQueryExpression.ToSqlString()} ) SUBDEL) ");
  865. }
  866. return this;
  867. }
  868. public IUpdateable<T> WhereIF(bool isWhere, Expression<Func<T, bool>> expression)
  869. {
  870. Check.ExceptionEasy(!StaticConfig.EnableAllWhereIF, "Need to program startup configuration StaticConfig. EnableAllWhereIF = true; Tip: This operation is very risky if there are no conditions it is easy to update the entire table", " 需要程序启动时配置StaticConfig.EnableAllWhereIF=true; 提示:该操作存在很大的风险如果没有条件很容易将整个表全部更新");
  871. if (isWhere)
  872. {
  873. return Where(expression);
  874. }
  875. return this;
  876. }
  877. public IUpdateable<T> Where(Expression<Func<T, bool>> expression)
  878. {
  879. Check.Exception(UpdateObjectNotWhere()&&UpdateObjs.Length > 1, ErrorMessage.GetThrowMessage("update List no support where","集合更新不支持Where请使用WhereColumns"));
  880. var expResult = UpdateBuilder.GetExpressionValue(expression, ResolveExpressType.WhereSingle);
  881. var whereString = expResult.GetResultString();
  882. if (expression.ToString().Contains("Subqueryable()"))
  883. {
  884. var entityTableName = this.EntityInfo.DbTableName;
  885. if (UpdateBuilder.TableName.HasValue())
  886. {
  887. entityTableName = UpdateBuilder.TableName;
  888. }
  889. if (ExpressionTool.GetParameters(expression).First().Type == typeof(T))
  890. {
  891. var tableName = this.SqlBuilder.GetTranslationColumnName(entityTableName);
  892. whereString = whereString.Replace(tableName, $"( SELECT * FROM {tableName}) ");
  893. }
  894. whereString = whereString.Replace(this.SqlBuilder.GetTranslationColumnName(expression.Parameters.First().Name) + ".", this.SqlBuilder.GetTranslationTableName(entityTableName) + ".");
  895. }
  896. else if (expResult.IsNavicate)
  897. {
  898. var entityTableName2 = this.EntityInfo.DbTableName;
  899. if (this.UpdateBuilder.TableName.HasValue())
  900. {
  901. entityTableName2 = this.UpdateBuilder.TableName;
  902. }
  903. whereString = whereString.Replace(expression.Parameters.First().Name + ".", this.SqlBuilder.GetTranslationTableName(entityTableName2) + ".");
  904. whereString = whereString.Replace(this.SqlBuilder.GetTranslationColumnName(expression.Parameters.First().Name) + ".", this.SqlBuilder.GetTranslationTableName(entityTableName2) + ".");
  905. }
  906. UpdateBuilder.WhereValues.Add(whereString);
  907. return this;
  908. }
  909. public IUpdateable<T> Where(string whereSql, object parameters = null)
  910. {
  911. Check.Exception(UpdateObjectNotWhere() && UpdateObjs.Length > 1, ErrorMessage.GetThrowMessage("update List no support where", "集合更新不支持Where请使用WhereColumns"));
  912. if (whereSql.HasValue())
  913. {
  914. UpdateBuilder.WhereValues.Add(whereSql);
  915. }
  916. if (parameters != null)
  917. {
  918. UpdateBuilder.Parameters.AddRange(Context.Ado.GetParameters(parameters));
  919. }
  920. return this;
  921. }
  922. public IUpdateable<T> Where(string fieldName, string conditionalType, object fieldValue)
  923. {
  924. Check.Exception(UpdateObjectNotWhere() && UpdateObjs.Length > 1, ErrorMessage.GetThrowMessage("update List no support where", "集合更新不支持Where请使用WhereColumns"));
  925. var whereSql = this.SqlBuilder.GetWhere(fieldName, conditionalType, 0);
  926. this.Where(whereSql);
  927. string parameterName = this.SqlBuilder.SqlParameterKeyWord + fieldName + "0";
  928. this.UpdateBuilder.Parameters.Add(new SugarParameter(parameterName, fieldValue));
  929. return this;
  930. }
  931. public IUpdateable<T> Where(List<IConditionalModel> conditionalModels)
  932. {
  933. Check.Exception(UpdateObjectNotWhere() && UpdateObjs.Length > 1, ErrorMessage.GetThrowMessage("update List no support where", "集合更新不支持Where请使用WhereColumns"));
  934. var sql = this.Context.Queryable<T>().SqlBuilder.ConditionalModelToSql(conditionalModels);
  935. var result = this;
  936. result.Where(sql.Key, sql.Value);
  937. return result;
  938. }
  939. public IUpdateable<T> In(object[] ids)
  940. {
  941. ThrowUpdateByObjectByMesage(" In(object[] ids) ");
  942. List<IConditionalModel> conditionalModels = new List<IConditionalModel>();
  943. var column = this.EntityInfo.Columns.FirstOrDefault(it => it.IsPrimarykey);
  944. Check.ExceptionEasy(column == null, "In need primary key", "In需要实体有主键");
  945. conditionalModels.Add(new ConditionalModel() { FieldName= column.DbColumnName, ConditionalType= ConditionalType.In,FieldValue=string.Join(",",ids),CSharpTypeName=column.UnderType?.Name } );
  946. return this.Where(conditionalModels);
  947. }
  948. #endregion
  949. }
  950. }