SqlSugarProvider.cs 93 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Data;
  5. using System.Dynamic;
  6. using System.Linq;
  7. using System.Linq.Expressions;
  8. using System.Reflection;
  9. using System.Text;
  10. using System.Text.RegularExpressions;
  11. using System.Threading.Tasks;
  12. namespace SqlSugar
  13. {
  14. ///<summary>
  15. /// ** description:Create datathis.access object
  16. /// ** author:sunkaixuan
  17. /// ** date:2017/1/2
  18. /// ** email:610262374@qq.com
  19. /// </summary>
  20. public partial class SqlSugarProvider : ISqlSugarClient
  21. {
  22. #region Constructor
  23. public SqlSugarProvider(ConnectionConfig config)
  24. {
  25. this.Context = this;
  26. this.CurrentConnectionConfig = config;
  27. this.ContextID = Guid.NewGuid();
  28. Check.ArgumentNullException(config, "config is null");
  29. CheckDbDependency(config);
  30. if (StaticConfig.CompleteDbFunc != null)
  31. {
  32. StaticConfig.CompleteDbFunc(this);
  33. }
  34. }
  35. #endregion
  36. #region ADO Methods
  37. /// <summary>
  38. ///Datathis.operation
  39. /// </summary>
  40. public virtual IAdo Ado
  41. {
  42. get
  43. {
  44. if (this.ContextAdo == null)
  45. {
  46. var result = InstanceFactory.GetAdo(this.Context.CurrentConnectionConfig);
  47. this.ContextAdo = result;
  48. result.Context = this;
  49. return result;
  50. }
  51. return this._Ado;
  52. }
  53. }
  54. #endregion
  55. #region Aop Log Methods
  56. public virtual AopProvider Aop { get { return new AopProvider(this); } }
  57. #endregion
  58. #region Util Methods
  59. [Obsolete("Use SqlSugarClient.Utilities")]
  60. public virtual IContextMethods RewritableMethods
  61. {
  62. get { return this.Context.Utilities; }
  63. set { this.Context.Utilities = value; }
  64. }
  65. public virtual IContextMethods Utilities
  66. {
  67. get
  68. {
  69. if (ContextRewritableMethods == null)
  70. {
  71. ContextRewritableMethods = new ContextMethods();
  72. ContextRewritableMethods.Context = this;
  73. }
  74. return ContextRewritableMethods;
  75. }
  76. set { ContextRewritableMethods = value; }
  77. }
  78. #endregion
  79. #region Queryable
  80. public QueryMethodInfo QueryableByObject(Type entityType)
  81. {
  82. QueryMethodInfo result = new QueryMethodInfo();
  83. var method=this.GetType().GetMyMethod("Queryable", 0);
  84. var methodT=method.MakeGenericMethod(entityType);
  85. var queryableObj=methodT.Invoke(this,new object[] {});
  86. result.QueryableObj = queryableObj;
  87. result.Context = this.Context;
  88. result.EntityType = entityType;
  89. return result;
  90. }
  91. public QueryMethodInfo QueryableByObject(Type entityType, string shortName)
  92. {
  93. return this.QueryableByObject(entityType).AS(this.Context.EntityMaintenance.GetTableName(entityType),shortName);
  94. }
  95. /// <summary>
  96. /// Get datebase time
  97. /// </summary>
  98. /// <returns></returns>
  99. public DateTime GetDate()
  100. {
  101. var sqlBuilder = InstanceFactory.GetSqlbuilder(this.Context.CurrentConnectionConfig);
  102. return this.Ado.GetDateTime(sqlBuilder.FullSqlDateNow);
  103. }
  104. public ISugarQueryable<T> MasterQueryable<T>()
  105. {
  106. var result = this.Queryable<T>();
  107. result.QueryBuilder.IsDisableMasterSlaveSeparation = true;
  108. return result;
  109. }
  110. public ISugarQueryable<T> SlaveQueryable<T>()
  111. {
  112. var result = this.Queryable<T>();
  113. result.QueryBuilder.IsEnableMasterSlaveSeparation = true;
  114. return result;
  115. }
  116. /// <summary>
  117. /// Lambda Query operation
  118. /// </summary>
  119. public virtual ISugarQueryable<T> Queryable<T>()
  120. {
  121. InitMappingInfo<T>();
  122. var result = this.CreateQueryable<T>();
  123. UtilMethods.AddDiscrimator(typeof(T), result);
  124. return result;
  125. }
  126. /// <summary>
  127. /// Lambda Query operation
  128. /// </summary>
  129. public virtual ISugarQueryable<T> Queryable<T>(string shortName)
  130. {
  131. Check.Exception(shortName.HasValue() && shortName.Length > 40, ErrorMessage.GetThrowMessage("shortName参数长度不能超过40,你可能是想用这个方法 db.SqlQueryable(sql)而不是db.Queryable(shortName)", "Queryable.shortName max length 20"));
  132. var queryable = Queryable<T>();
  133. queryable.SqlBuilder.QueryBuilder.TableShortName = shortName;
  134. return queryable;
  135. }
  136. /// <summary>
  137. /// Lambda Query operation
  138. /// </summary>
  139. public virtual ISugarQueryable<ExpandoObject> Queryable(string tableName, string shortName)
  140. {
  141. var queryable = Queryable<ExpandoObject>();
  142. queryable.SqlBuilder.QueryBuilder.EntityName = tableName;
  143. queryable.SqlBuilder.QueryBuilder.TableShortName = shortName;
  144. return queryable;
  145. }
  146. public virtual ISugarQueryable<T, T2> Queryable<T, T2>(Expression<Func<T, T2, object[]>> joinExpression)
  147. {
  148. InitMappingInfo<T, T2>();
  149. var types = new Type[] { typeof(T2) };
  150. var queryable = InstanceFactory.GetQueryable<T, T2>(this.CurrentConnectionConfig);
  151. this.CreateQueryJoin(joinExpression, types, queryable);
  152. return queryable;
  153. }
  154. public virtual ISugarQueryable<T, T2> Queryable<T, T2>(Expression<Func<T, T2, JoinQueryInfos>> joinExpression)
  155. {
  156. InitMappingInfo<T, T2>();
  157. var types = new Type[] { typeof(T2) };
  158. var queryable = InstanceFactory.GetQueryable<T, T2>(this.CurrentConnectionConfig);
  159. this.CreateQueryJoin(joinExpression, types, queryable);
  160. return queryable;
  161. }
  162. public virtual ISugarQueryable<T, T2, T3> Queryable<T, T2, T3>(Expression<Func<T, T2, T3, object[]>> joinExpression)
  163. {
  164. InitMappingInfo<T, T2, T3>();
  165. var types = new Type[] { typeof(T2), typeof(T3) };
  166. var queryable = InstanceFactory.GetQueryable<T, T2, T3>(this.CurrentConnectionConfig);
  167. this.CreateQueryJoin(joinExpression, types, queryable);
  168. return queryable;
  169. }
  170. public virtual ISugarQueryable<T, T2, T3> Queryable<T, T2, T3>(Expression<Func<T, T2, T3, JoinQueryInfos>> joinExpression)
  171. {
  172. InitMappingInfo<T, T2, T3>();
  173. var types = new Type[] { typeof(T2), typeof(T3) };
  174. var queryable = InstanceFactory.GetQueryable<T, T2, T3>(this.CurrentConnectionConfig);
  175. this.CreateQueryJoin(joinExpression, types, queryable);
  176. return queryable;
  177. }
  178. public virtual ISugarQueryable<T, T2, T3, T4> Queryable<T, T2, T3, T4>(Expression<Func<T, T2, T3, T4, object[]>> joinExpression)
  179. {
  180. InitMappingInfo<T, T2, T3, T4>();
  181. var types = new Type[] { typeof(T2), typeof(T3), typeof(T4) };
  182. var queryable = InstanceFactory.GetQueryable<T, T2, T3, T4>(this.CurrentConnectionConfig);
  183. this.CreateQueryJoin(joinExpression, types, queryable);
  184. return queryable;
  185. }
  186. public virtual ISugarQueryable<T, T2, T3, T4> Queryable<T, T2, T3, T4>(Expression<Func<T, T2, T3, T4, JoinQueryInfos>> joinExpression)
  187. {
  188. InitMappingInfo<T, T2, T3, T4>();
  189. var types = new Type[] { typeof(T2), typeof(T3), typeof(T4) };
  190. var queryable = InstanceFactory.GetQueryable<T, T2, T3, T4>(this.CurrentConnectionConfig);
  191. this.CreateQueryJoin(joinExpression, types, queryable);
  192. return queryable;
  193. }
  194. public virtual ISugarQueryable<T, T2, T3, T4, T5> Queryable<T, T2, T3, T4, T5>(Expression<Func<T, T2, T3, T4, T5, object[]>> joinExpression)
  195. {
  196. InitMappingInfo<T, T2, T3, T4, T5>();
  197. var types = new Type[] { typeof(T2), typeof(T3), typeof(T4), typeof(T5) };
  198. var queryable = InstanceFactory.GetQueryable<T, T2, T3, T4, T5>(this.CurrentConnectionConfig);
  199. this.CreateQueryJoin(joinExpression, types, queryable);
  200. return queryable;
  201. }
  202. public virtual ISugarQueryable<T, T2, T3, T4, T5> Queryable<T, T2, T3, T4, T5>(Expression<Func<T, T2, T3, T4, T5, JoinQueryInfos>> joinExpression)
  203. {
  204. InitMappingInfo<T, T2, T3, T4, T5>();
  205. var types = new Type[] { typeof(T2), typeof(T3), typeof(T4), typeof(T5) };
  206. var queryable = InstanceFactory.GetQueryable<T, T2, T3, T4, T5>(this.CurrentConnectionConfig);
  207. this.CreateQueryJoin(joinExpression, types, queryable);
  208. return queryable;
  209. }
  210. public virtual ISugarQueryable<T, T2, T3, T4, T5, T6> Queryable<T, T2, T3, T4, T5, T6>(Expression<Func<T, T2, T3, T4, T5, T6, object[]>> joinExpression)
  211. {
  212. InitMappingInfo<T, T2, T3, T4, T5, T6>();
  213. var types = new Type[] { typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6) };
  214. var queryable = InstanceFactory.GetQueryable<T, T2, T3, T4, T5, T6>(this.CurrentConnectionConfig);
  215. this.CreateQueryJoin(joinExpression, types, queryable);
  216. return queryable;
  217. }
  218. public virtual ISugarQueryable<T, T2, T3, T4, T5, T6> Queryable<T, T2, T3, T4, T5, T6>(Expression<Func<T, T2, T3, T4, T5, T6, JoinQueryInfos>> joinExpression)
  219. {
  220. InitMappingInfo<T, T2, T3, T4, T5, T6>();
  221. var types = new Type[] { typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6) };
  222. var queryable = InstanceFactory.GetQueryable<T, T2, T3, T4, T5, T6>(this.CurrentConnectionConfig);
  223. this.CreateQueryJoin(joinExpression, types, queryable);
  224. return queryable;
  225. }
  226. public virtual ISugarQueryable<T, T2, T3, T4, T5, T6, T7> Queryable<T, T2, T3, T4, T5, T6, T7>(Expression<Func<T, T2, T3, T4, T5, T6, T7, object[]>> joinExpression)
  227. {
  228. InitMappingInfo<T, T2, T3, T4, T5, T6, T7>();
  229. var types = new Type[] { typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6), typeof(T7) };
  230. var queryable = InstanceFactory.GetQueryable<T, T2, T3, T4, T5, T6, T7>(this.CurrentConnectionConfig);
  231. this.CreateQueryJoin(joinExpression, types, queryable);
  232. return queryable;
  233. }
  234. public virtual ISugarQueryable<T, T2, T3, T4, T5, T6, T7> Queryable<T, T2, T3, T4, T5, T6, T7>(Expression<Func<T, T2, T3, T4, T5, T6, T7, JoinQueryInfos>> joinExpression)
  235. {
  236. InitMappingInfo<T, T2, T3, T4, T5, T6, T7>();
  237. var types = new Type[] { typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6), typeof(T7) };
  238. var queryable = InstanceFactory.GetQueryable<T, T2, T3, T4, T5, T6, T7>(this.CurrentConnectionConfig);
  239. this.CreateQueryJoin(joinExpression, types, queryable);
  240. return queryable;
  241. }
  242. public virtual ISugarQueryable<T, T2, T3, T4, T5, T6, T7, T8> Queryable<T, T2, T3, T4, T5, T6, T7, T8>(Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, object[]>> joinExpression)
  243. {
  244. InitMappingInfo<T, T2, T3, T4, T5, T6, T7, T8>();
  245. var types = new Type[] { typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6), typeof(T7), typeof(T8) };
  246. var queryable = InstanceFactory.GetQueryable<T, T2, T3, T4, T5, T6, T7, T8>(this.CurrentConnectionConfig);
  247. this.CreateQueryJoin(joinExpression, types, queryable);
  248. return queryable;
  249. }
  250. public virtual ISugarQueryable<T, T2, T3, T4, T5, T6, T7, T8> Queryable<T, T2, T3, T4, T5, T6, T7, T8>(Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, JoinQueryInfos>> joinExpression)
  251. {
  252. InitMappingInfo<T, T2, T3, T4, T5, T6, T7, T8>();
  253. var types = new Type[] { typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6), typeof(T7), typeof(T8) };
  254. var queryable = InstanceFactory.GetQueryable<T, T2, T3, T4, T5, T6, T7, T8>(this.CurrentConnectionConfig);
  255. this.CreateQueryJoin(joinExpression, types, queryable);
  256. return queryable;
  257. }
  258. #region 9-12
  259. public virtual ISugarQueryable<T, T2, T3, T4, T5, T6, T7, T8, T9> Queryable<T, T2, T3, T4, T5, T6, T7, T8, T9>(Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, T9, object[]>> joinExpression)
  260. {
  261. InitMappingInfo<T, T2, T3, T4, T5, T6, T7, T8, T9>();
  262. var types = new Type[] { typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6), typeof(T7), typeof(T8), typeof(T9) };
  263. var queryable = InstanceFactory.GetQueryable<T, T2, T3, T4, T5, T6, T7, T8, T9>(this.CurrentConnectionConfig);
  264. this.CreateQueryJoin(joinExpression, types, queryable);
  265. return queryable;
  266. }
  267. public virtual ISugarQueryable<T, T2, T3, T4, T5, T6, T7, T8, T9> Queryable<T, T2, T3, T4, T5, T6, T7, T8, T9>(Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, T9, JoinQueryInfos>> joinExpression)
  268. {
  269. InitMappingInfo<T, T2, T3, T4, T5, T6, T7, T8, T9>();
  270. var types = new Type[] { typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6), typeof(T7), typeof(T8), typeof(T9) };
  271. var queryable = InstanceFactory.GetQueryable<T, T2, T3, T4, T5, T6, T7, T8, T9>(this.CurrentConnectionConfig);
  272. this.CreateQueryJoin(joinExpression, types, queryable);
  273. return queryable;
  274. }
  275. public virtual ISugarQueryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10> Queryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10>(Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, object[]>> joinExpression)
  276. {
  277. InitMappingInfo<T, T2, T3, T4, T5, T6, T7, T8, T9, T10>();
  278. var types = new Type[] { typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6), typeof(T7), typeof(T8), typeof(T9), typeof(T10) };
  279. var queryable = InstanceFactory.GetQueryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10>(this.CurrentConnectionConfig);
  280. this.CreateQueryJoin(joinExpression, types, queryable);
  281. return queryable;
  282. }
  283. public virtual ISugarQueryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10> Queryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10>(Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, JoinQueryInfos>> joinExpression)
  284. {
  285. InitMappingInfo<T, T2, T3, T4, T5, T6, T7, T8, T9, T10>();
  286. var types = new Type[] { typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6), typeof(T7), typeof(T8), typeof(T9), typeof(T10) };
  287. var queryable = InstanceFactory.GetQueryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10>(this.CurrentConnectionConfig);
  288. this.CreateQueryJoin(joinExpression, types, queryable);
  289. return queryable;
  290. }
  291. public virtual ISugarQueryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Queryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, object[]>> joinExpression)
  292. {
  293. InitMappingInfo<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>();
  294. var types = new Type[] { typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6), typeof(T7), typeof(T8), typeof(T9), typeof(T10), typeof(T11) };
  295. var queryable = InstanceFactory.GetQueryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(this.CurrentConnectionConfig);
  296. this.CreateQueryJoin(joinExpression, types, queryable);
  297. return queryable;
  298. }
  299. public virtual ISugarQueryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Queryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, JoinQueryInfos>> joinExpression)
  300. {
  301. InitMappingInfo<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>();
  302. var types = new Type[] { typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6), typeof(T7), typeof(T8), typeof(T9), typeof(T10), typeof(T11) };
  303. var queryable = InstanceFactory.GetQueryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(this.CurrentConnectionConfig);
  304. this.CreateQueryJoin(joinExpression, types, queryable);
  305. return queryable;
  306. }
  307. public virtual ISugarQueryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Queryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, object[]>> joinExpression)
  308. {
  309. InitMappingInfo<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>();
  310. var types = new Type[] { typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6), typeof(T7), typeof(T8), typeof(T9), typeof(T10), typeof(T11), typeof(T12) };
  311. var queryable = InstanceFactory.GetQueryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(this.CurrentConnectionConfig);
  312. this.CreateQueryJoin(joinExpression, types, queryable);
  313. return queryable;
  314. }
  315. public virtual ISugarQueryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Queryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, JoinQueryInfos>> joinExpression)
  316. {
  317. InitMappingInfo<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>();
  318. var types = new Type[] { typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6), typeof(T7), typeof(T8), typeof(T9), typeof(T10), typeof(T11), typeof(T12) };
  319. var queryable = InstanceFactory.GetQueryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(this.CurrentConnectionConfig);
  320. this.CreateQueryJoin(joinExpression, types, queryable);
  321. return queryable;
  322. }
  323. #endregion
  324. public virtual ISugarQueryable<T, T2> Queryable<T, T2>(Expression<Func<T, T2, bool>> joinExpression) where T : class, new()
  325. {
  326. InitMappingInfo<T, T2>();
  327. var types = new Type[] { typeof(T2) };
  328. var queryable = InstanceFactory.GetQueryable<T, T2>(this.CurrentConnectionConfig);
  329. this.CreateEasyQueryJoin(joinExpression, types, queryable);
  330. queryable.Where(joinExpression);
  331. return queryable;
  332. }
  333. public virtual ISugarQueryable<T, T2, T3> Queryable<T, T2, T3>(Expression<Func<T, T2, T3, bool>> joinExpression) where T : class, new()
  334. {
  335. InitMappingInfo<T, T2, T3>();
  336. var types = new Type[] { typeof(T2), typeof(T3) };
  337. var queryable = InstanceFactory.GetQueryable<T, T2, T3>(this.CurrentConnectionConfig);
  338. this.CreateEasyQueryJoin(joinExpression, types, queryable);
  339. queryable.Where(joinExpression);
  340. return queryable;
  341. }
  342. public virtual ISugarQueryable<T, T2, T3, T4> Queryable<T, T2, T3, T4>(Expression<Func<T, T2, T3, T4, bool>> joinExpression) where T : class, new()
  343. {
  344. InitMappingInfo<T, T2, T3, T4>();
  345. var types = new Type[] { typeof(T2), typeof(T3), typeof(T4) };
  346. var queryable = InstanceFactory.GetQueryable<T, T2, T3, T4>(this.CurrentConnectionConfig);
  347. this.CreateEasyQueryJoin(joinExpression, types, queryable);
  348. queryable.Where(joinExpression);
  349. return queryable;
  350. }
  351. public virtual ISugarQueryable<T, T2, T3, T4, T5> Queryable<T, T2, T3, T4, T5>(Expression<Func<T, T2, T3, T4, T5, bool>> joinExpression) where T : class, new()
  352. {
  353. InitMappingInfo<T, T2, T3, T4, T5>();
  354. var types = new Type[] { typeof(T2), typeof(T3), typeof(T4), typeof(T5) };
  355. var queryable = InstanceFactory.GetQueryable<T, T2, T3, T4, T5>(this.CurrentConnectionConfig);
  356. this.CreateEasyQueryJoin(joinExpression, types, queryable);
  357. queryable.Where(joinExpression);
  358. return queryable;
  359. }
  360. public virtual ISugarQueryable<T, T2, T3, T4, T5, T6> Queryable<T, T2, T3, T4, T5, T6>(Expression<Func<T, T2, T3, T4, T5, T6, bool>> joinExpression) where T : class, new()
  361. {
  362. InitMappingInfo<T, T2, T3, T4, T5, T6>();
  363. var types = new Type[] { typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6) };
  364. var queryable = InstanceFactory.GetQueryable<T, T2, T3, T4, T5, T6>(this.CurrentConnectionConfig);
  365. this.CreateEasyQueryJoin(joinExpression, types, queryable);
  366. queryable.Where(joinExpression);
  367. return queryable;
  368. }
  369. public virtual ISugarQueryable<T, T2, T3, T4, T5, T6, T7> Queryable<T, T2, T3, T4, T5, T6, T7>(Expression<Func<T, T2, T3, T4, T5, T6, T7, bool>> joinExpression) where T : class, new()
  370. {
  371. InitMappingInfo<T, T2, T3, T4, T5, T6, T7>();
  372. var types = new Type[] { typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6), typeof(T7) };
  373. var queryable = InstanceFactory.GetQueryable<T, T2, T3, T4, T5, T6, T7>(this.CurrentConnectionConfig);
  374. this.CreateEasyQueryJoin(joinExpression, types, queryable);
  375. queryable.Where(joinExpression);
  376. return queryable;
  377. }
  378. public virtual ISugarQueryable<T, T2, T3, T4, T5, T6, T7, T8> Queryable<T, T2, T3, T4, T5, T6, T7, T8>(Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, bool>> joinExpression) where T : class, new()
  379. {
  380. InitMappingInfo<T, T2, T3, T4, T5, T6, T7, T8>();
  381. var types = new Type[] { typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6), typeof(T7), typeof(T8) };
  382. var queryable = InstanceFactory.GetQueryable<T, T2, T3, T4, T5, T6, T7, T8>(this.CurrentConnectionConfig);
  383. this.CreateEasyQueryJoin(joinExpression, types, queryable);
  384. queryable.Where(joinExpression);
  385. return queryable;
  386. }
  387. #region 9-12
  388. public virtual ISugarQueryable<T, T2, T3, T4, T5, T6, T7, T8, T9> Queryable<T, T2, T3, T4, T5, T6, T7, T8, T9>(Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, T9, bool>> joinExpression) where T : class, new()
  389. {
  390. InitMappingInfo<T, T2, T3, T4, T5, T6, T7, T8, T9>();
  391. var types = new Type[] { typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6), typeof(T7), typeof(T8), typeof(T9) };
  392. var queryable = InstanceFactory.GetQueryable<T, T2, T3, T4, T5, T6, T7, T8, T9>(this.CurrentConnectionConfig);
  393. this.CreateEasyQueryJoin(joinExpression, types, queryable);
  394. queryable.Where(joinExpression);
  395. return queryable;
  396. }
  397. public virtual ISugarQueryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10> Queryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10>(Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, bool>> joinExpression) where T : class, new()
  398. {
  399. InitMappingInfo<T, T2, T3, T4, T5, T6, T7, T8, T9, T10>();
  400. var types = new Type[] { typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6), typeof(T7), typeof(T8), typeof(T9), typeof(T10) };
  401. var queryable = InstanceFactory.GetQueryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10>(this.CurrentConnectionConfig);
  402. this.CreateEasyQueryJoin(joinExpression, types, queryable);
  403. queryable.Where(joinExpression);
  404. return queryable;
  405. }
  406. public virtual ISugarQueryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Queryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, bool>> joinExpression) where T : class, new()
  407. {
  408. InitMappingInfo<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>();
  409. var types = new Type[] { typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6), typeof(T7), typeof(T8), typeof(T9), typeof(T10), typeof(T11) };
  410. var queryable = InstanceFactory.GetQueryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(this.CurrentConnectionConfig);
  411. this.CreateEasyQueryJoin(joinExpression, types, queryable);
  412. queryable.Where(joinExpression);
  413. return queryable;
  414. }
  415. public virtual ISugarQueryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Queryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, bool>> joinExpression) where T : class, new()
  416. {
  417. InitMappingInfo<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>();
  418. var types = new Type[] { typeof(T2), typeof(T3), typeof(T4), typeof(T5), typeof(T6), typeof(T7), typeof(T8), typeof(T9), typeof(T10), typeof(T11), typeof(T12) };
  419. var queryable = InstanceFactory.GetQueryable<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(this.CurrentConnectionConfig);
  420. this.CreateEasyQueryJoin(joinExpression, types, queryable);
  421. queryable.Where(joinExpression);
  422. return queryable;
  423. }
  424. public virtual ISugarQueryable<T> Queryable<T>(ISugarQueryable<T> queryable)
  425. {
  426. var sqlobj = queryable.ToSql();
  427. var newQueryable = this.SqlQueryable<object>(sqlobj.Key).AddParameters(sqlobj.Value);
  428. var result = newQueryable.Select<T>(newQueryable.QueryBuilder.SelectValue+"");
  429. result.QueryBuilder.IsSqlQuery = false;
  430. result.QueryBuilder.NoCheckInclude = true;
  431. result.QueryBuilder.Includes = queryable.QueryBuilder.Includes?.ToList();
  432. return result;
  433. }
  434. public virtual ISugarQueryable<T> Queryable<T>(ISugarQueryable<T> queryable,string shortName)
  435. {
  436. var result = Queryable(queryable);
  437. var key = result.QueryBuilder.AsTables.First().Key;
  438. var value = result.QueryBuilder.AsTables.First().Value;
  439. result.QueryBuilder.AsTables.Remove(key);
  440. result.QueryBuilder.AsTables.Add(key, value.TrimEnd(' ').TrimEnd('t') + shortName);
  441. return result;
  442. }
  443. public virtual ISugarQueryable<T, T2> Queryable<T, T2>(
  444. ISugarQueryable<T> joinQueryable1, ISugarQueryable<T2> joinQueryable2, Expression<Func<T, T2, bool>> joinExpression) where T : class, new() where T2 : class, new()
  445. {
  446. return Queryable(joinQueryable1, joinQueryable2, JoinType.Inner, joinExpression);
  447. }
  448. public virtual ISugarQueryable<T, T2> Queryable<T, T2>(
  449. ISugarQueryable<T> joinQueryable1, ISugarQueryable<T2> joinQueryable2, JoinType joinType, Expression<Func<T, T2, bool>> joinExpression) where T : class, new() where T2 : class, new()
  450. {
  451. Check.Exception(joinQueryable1.QueryBuilder.Take != null || joinQueryable1.QueryBuilder.Skip != null || joinQueryable1.QueryBuilder.OrderByValue.HasValue(), "joinQueryable1 Cannot have 'Skip' 'ToPageList' 'Take' Or 'OrderBy'");
  452. Check.Exception(joinQueryable2.QueryBuilder.Take != null || joinQueryable2.QueryBuilder.Skip != null || joinQueryable2.QueryBuilder.OrderByValue.HasValue(), "joinQueryable2 Cannot have 'Skip' 'ToPageList' 'Take' Or 'OrderBy'");
  453. var sqlBuilder = InstanceFactory.GetSqlbuilder(this.Context.CurrentConnectionConfig);
  454. sqlBuilder.Context = this;
  455. InitMappingInfo<T, T2>();
  456. var types = new Type[] { typeof(T2) };
  457. var queryable = InstanceFactory.GetQueryable<T, T2>(this.CurrentConnectionConfig);
  458. queryable.Context = this.Context;
  459. queryable.SqlBuilder = sqlBuilder;
  460. queryable.QueryBuilder = InstanceFactory.GetQueryBuilder(this.CurrentConnectionConfig);
  461. queryable.QueryBuilder.JoinQueryInfos = new List<JoinQueryInfo>();
  462. queryable.QueryBuilder.Builder = sqlBuilder;
  463. queryable.QueryBuilder.Context = this;
  464. queryable.QueryBuilder.EntityType = typeof(T);
  465. queryable.QueryBuilder.LambdaExpressions = InstanceFactory.GetLambdaExpressions(this.CurrentConnectionConfig);
  466. //master
  467. var shortName1 = joinExpression.Parameters[0].Name;
  468. var sqlObj1 = joinQueryable1.ToSql();
  469. string sql1 = sqlObj1.Key;
  470. UtilMethods.RepairReplicationParameters(ref sql1, sqlObj1.Value.ToArray(), 0, "Join");
  471. queryable.QueryBuilder.EntityName = sqlBuilder.GetPackTable(sql1, sqlBuilder.GetTranslationColumnName(shortName1)); ;
  472. queryable.QueryBuilder.Parameters.AddRange(sqlObj1.Value);
  473. //join table 1
  474. var shortName2 = joinExpression.Parameters[1].Name;
  475. var sqlObj2 = joinQueryable2.ToSql();
  476. string sql2 = sqlObj2.Key;
  477. UtilMethods.RepairReplicationParameters(ref sql2, sqlObj2.Value.ToArray(), 1, "Join");
  478. queryable.QueryBuilder.Parameters.AddRange(sqlObj2.Value);
  479. var exp = queryable.QueryBuilder.GetExpressionValue(joinExpression, ResolveExpressType.WhereMultiple);
  480. queryable.QueryBuilder.JoinQueryInfos.Add(new JoinQueryInfo() { JoinIndex = 0, JoinType = joinType, JoinWhere = exp.GetResultString(), TableName = sqlBuilder.GetPackTable(sql2,sqlBuilder.GetTranslationColumnName(shortName2)) });
  481. return queryable;
  482. }
  483. public virtual ISugarQueryable<T, T2 ,T3> Queryable<T, T2 ,T3>(
  484. ISugarQueryable<T> joinQueryable1, ISugarQueryable<T2> joinQueryable2, ISugarQueryable<T3> joinQueryable3,
  485. JoinType joinType1, Expression<Func<T, T2, T3, bool>> joinExpression1 ,
  486. JoinType joinType2 , Expression<Func<T, T2, T3,bool>> joinExpression2
  487. ) where T : class, new() where T2 : class, new() where T3 : class, new()
  488. {
  489. Check.Exception(joinQueryable1.QueryBuilder.Take != null || joinQueryable1.QueryBuilder.Skip != null || joinQueryable1.QueryBuilder.OrderByValue.HasValue(), "joinQueryable1 Cannot have 'Skip' 'ToPageList' 'Take' Or 'OrderBy'");
  490. Check.Exception(joinQueryable2.QueryBuilder.Take != null || joinQueryable2.QueryBuilder.Skip != null || joinQueryable2.QueryBuilder.OrderByValue.HasValue(), "joinQueryable2 Cannot have 'Skip' 'ToPageList' 'Take' Or 'OrderBy'");
  491. Check.Exception(joinQueryable3.QueryBuilder.Take != null || joinQueryable3.QueryBuilder.Skip != null || joinQueryable3.QueryBuilder.OrderByValue.HasValue(), "joinQueryable3 Cannot have 'Skip' 'ToPageList' 'Take' Or 'OrderBy'");
  492. var sqlBuilder = InstanceFactory.GetSqlbuilder(this.Context.CurrentConnectionConfig);
  493. sqlBuilder.Context = this;
  494. InitMappingInfo<T, T2,T3>();
  495. var types = new Type[] { typeof(T2) };
  496. var queryable = InstanceFactory.GetQueryable<T, T2,T3>(this.CurrentConnectionConfig);
  497. queryable.Context = this.Context;
  498. queryable.SqlBuilder = sqlBuilder;
  499. queryable.QueryBuilder = InstanceFactory.GetQueryBuilder(this.CurrentConnectionConfig);
  500. queryable.QueryBuilder.JoinQueryInfos = new List<JoinQueryInfo>();
  501. queryable.QueryBuilder.Builder = sqlBuilder;
  502. queryable.QueryBuilder.Context = this;
  503. queryable.QueryBuilder.EntityType = typeof(T);
  504. queryable.QueryBuilder.LambdaExpressions = InstanceFactory.GetLambdaExpressions(this.CurrentConnectionConfig);
  505. //master
  506. var shortName1 = joinExpression1.Parameters[0].Name;
  507. var sqlObj1 = joinQueryable1.ToSql();
  508. string sql1 = sqlObj1.Key;
  509. UtilMethods.RepairReplicationParameters(ref sql1, sqlObj1.Value.ToArray(), 0, "Join");
  510. queryable.QueryBuilder.EntityName = sqlBuilder.GetPackTable(sql1, shortName1); ;
  511. queryable.QueryBuilder.Parameters.AddRange(sqlObj1.Value);
  512. //join table 1
  513. var shortName2 = joinExpression1.Parameters[1].Name;
  514. var sqlObj2 = joinQueryable2.ToSql();
  515. string sql2 = sqlObj2.Key;
  516. UtilMethods.RepairReplicationParameters(ref sql2, sqlObj2.Value.ToArray(), 1, "Join");
  517. queryable.QueryBuilder.Parameters.AddRange(sqlObj2.Value);
  518. var exp = queryable.QueryBuilder.GetExpressionValue(joinExpression1, ResolveExpressType.WhereMultiple);
  519. queryable.QueryBuilder.JoinQueryInfos.Add(new JoinQueryInfo() { JoinIndex = 0, JoinType = joinType1, JoinWhere = exp.GetResultString(), TableName = sqlBuilder.GetPackTable(sql2, shortName2) });
  520. //join table 2
  521. var shortName3 = joinExpression1.Parameters[2].Name;
  522. var sqlObj3 = joinQueryable3.ToSql();
  523. string sql3 = sqlObj3.Key;
  524. UtilMethods.RepairReplicationParameters(ref sql3, sqlObj3.Value.ToArray(), 2, "Join");
  525. queryable.QueryBuilder.Parameters.AddRange(sqlObj3.Value);
  526. var exp2 = queryable.QueryBuilder.GetExpressionValue(joinExpression2, ResolveExpressType.WhereMultiple);
  527. queryable.QueryBuilder.JoinQueryInfos.Add(new JoinQueryInfo() { JoinIndex = 1, JoinType = joinType2, JoinWhere = exp2.GetResultString(), TableName = sqlBuilder.GetPackTable(sql3, shortName3) });
  528. return queryable;
  529. }
  530. public virtual ISugarQueryable<T, T2, T3,T4> Queryable<T, T2, T3,T4>(
  531. ISugarQueryable<T> joinQueryable1, ISugarQueryable<T2> joinQueryable2, ISugarQueryable<T3> joinQueryable3, ISugarQueryable<T4> joinQueryable4,
  532. JoinType joinType1, Expression<Func<T, T2, T3, T4, bool>> joinExpression1,
  533. JoinType joinType2, Expression<Func<T, T2, T3, T4, bool>> joinExpression2,
  534. JoinType joinType3, Expression<Func<T, T2, T3,T4, bool>> joinExpression3
  535. ) where T : class, new() where T2 : class, new() where T3 : class, new() where T4 : class, new()
  536. {
  537. Check.Exception(joinQueryable1.QueryBuilder.Take != null || joinQueryable1.QueryBuilder.Skip != null || joinQueryable1.QueryBuilder.OrderByValue.HasValue(), "joinQueryable1 Cannot have 'Skip' 'ToPageList' 'Take' Or 'OrderBy'");
  538. Check.Exception(joinQueryable2.QueryBuilder.Take != null || joinQueryable2.QueryBuilder.Skip != null || joinQueryable2.QueryBuilder.OrderByValue.HasValue(), "joinQueryable2 Cannot have 'Skip' 'ToPageList' 'Take' Or 'OrderBy'");
  539. Check.Exception(joinQueryable3.QueryBuilder.Take != null || joinQueryable3.QueryBuilder.Skip != null || joinQueryable3.QueryBuilder.OrderByValue.HasValue(), "joinQueryable3 Cannot have 'Skip' 'ToPageList' 'Take' Or 'OrderBy'");
  540. Check.Exception(joinQueryable4.QueryBuilder.Take != null || joinQueryable4.QueryBuilder.Skip != null || joinQueryable4.QueryBuilder.OrderByValue.HasValue(), "joinQueryable4 Cannot have 'Skip' 'ToPageList' 'Take' Or 'OrderBy'");
  541. var sqlBuilder = InstanceFactory.GetSqlbuilder(this.Context.CurrentConnectionConfig);
  542. sqlBuilder.Context = this;
  543. InitMappingInfo<T, T2, T3,T4>();
  544. var types = new Type[] { typeof(T2) };
  545. var queryable = InstanceFactory.GetQueryable<T, T2, T3,T4>(this.CurrentConnectionConfig);
  546. queryable.Context = this.Context;
  547. queryable.SqlBuilder = sqlBuilder;
  548. queryable.QueryBuilder = InstanceFactory.GetQueryBuilder(this.CurrentConnectionConfig);
  549. queryable.QueryBuilder.JoinQueryInfos = new List<JoinQueryInfo>();
  550. queryable.QueryBuilder.Builder = sqlBuilder;
  551. queryable.QueryBuilder.Context = this;
  552. queryable.QueryBuilder.EntityType = typeof(T);
  553. queryable.QueryBuilder.LambdaExpressions = InstanceFactory.GetLambdaExpressions(this.CurrentConnectionConfig);
  554. //master
  555. var shortName1 = joinExpression1.Parameters[0].Name;
  556. var sqlObj1 = joinQueryable1.ToSql();
  557. string sql1 = sqlObj1.Key;
  558. UtilMethods.RepairReplicationParameters(ref sql1, sqlObj1.Value.ToArray(), 0, "Join");
  559. queryable.QueryBuilder.EntityName = sqlBuilder.GetPackTable(sql1, shortName1); ;
  560. queryable.QueryBuilder.Parameters.AddRange(sqlObj1.Value);
  561. //join table 1
  562. var shortName2 = joinExpression1.Parameters[1].Name;
  563. var sqlObj2 = joinQueryable2.ToSql();
  564. string sql2 = sqlObj2.Key;
  565. UtilMethods.RepairReplicationParameters(ref sql2, sqlObj2.Value.ToArray(), 1, "Join");
  566. queryable.QueryBuilder.Parameters.AddRange(sqlObj2.Value);
  567. var exp = queryable.QueryBuilder.GetExpressionValue(joinExpression1, ResolveExpressType.WhereMultiple);
  568. queryable.QueryBuilder.JoinQueryInfos.Add(new JoinQueryInfo() { JoinIndex = 0, JoinType = joinType1, JoinWhere = exp.GetResultString(), TableName = sqlBuilder.GetPackTable(sql2, shortName2) });
  569. //join table 2
  570. var shortName3 = joinExpression1.Parameters[2].Name;
  571. var sqlObj3 = joinQueryable3.ToSql();
  572. string sql3 = sqlObj3.Key;
  573. UtilMethods.RepairReplicationParameters(ref sql3, sqlObj3.Value.ToArray(), 2, "Join");
  574. queryable.QueryBuilder.Parameters.AddRange(sqlObj3.Value);
  575. var exp2 = queryable.QueryBuilder.GetExpressionValue(joinExpression2, ResolveExpressType.WhereMultiple);
  576. queryable.QueryBuilder.JoinQueryInfos.Add(new JoinQueryInfo() { JoinIndex = 1, JoinType = joinType2, JoinWhere = exp2.GetResultString(), TableName = sqlBuilder.GetPackTable(sql3, shortName3) });
  577. //join table 3
  578. var shortName4 = joinExpression1.Parameters[3].Name;
  579. var sqlObj4 = joinQueryable4.ToSql();
  580. string sql4 = sqlObj4.Key;
  581. UtilMethods.RepairReplicationParameters(ref sql4, sqlObj4.Value.ToArray(), 3, "Join");
  582. queryable.QueryBuilder.Parameters.AddRange(sqlObj4.Value);
  583. var exp3 = queryable.QueryBuilder.GetExpressionValue(joinExpression3, ResolveExpressType.WhereMultiple);
  584. queryable.QueryBuilder.JoinQueryInfos.Add(new JoinQueryInfo() { JoinIndex = 1, JoinType = joinType3, JoinWhere = exp3.GetResultString(), TableName = sqlBuilder.GetPackTable(sql4, shortName4) });
  585. return queryable;
  586. }
  587. #endregion
  588. public virtual ISugarQueryable<T> UnionAll<T>(params ISugarQueryable<T>[] queryables) where T : class, new()
  589. {
  590. return _UnionAll(queryables);
  591. }
  592. internal ISugarQueryable<T> _UnionAll<T>(ISugarQueryable<T>[] queryables)
  593. {
  594. var sqlBuilder = InstanceFactory.GetSqlbuilder(this.Context.CurrentConnectionConfig);
  595. Check.Exception(queryables.IsNullOrEmpty(), "UnionAll.queryables is null ");
  596. int i = 1;
  597. List<KeyValuePair<string, List<SugarParameter>>> allItems = new List<KeyValuePair<string, List<SugarParameter>>>();
  598. foreach (var item in queryables)
  599. {
  600. var sqlObj = item.ToSql();
  601. string sql = sqlObj.Key;
  602. if (this.CurrentConnectionConfig?.MoreSettings?.MaxParameterNameLength > 0)
  603. {
  604. UtilMethods.RepairReplicationParameters(this.Context,ref sql, sqlObj.Value.ToArray(), i, "UnionAll");
  605. }
  606. else
  607. {
  608. UtilMethods.RepairReplicationParameters(ref sql, sqlObj.Value.ToArray(), i, "UnionAll");
  609. }
  610. if (sqlObj.Value.HasValue())
  611. allItems.Add(new KeyValuePair<string, List<SugarParameter>>(sqlBuilder.GetUnionFomatSql(sql), sqlObj.Value));
  612. else
  613. allItems.Add(new KeyValuePair<string, List<SugarParameter>>(sqlBuilder.GetUnionFomatSql(sql), new List<SugarParameter>()));
  614. i++;
  615. }
  616. var allSql = sqlBuilder.GetUnionAllSql(allItems.Select(it => it.Key).ToList());
  617. var allParameters = allItems.SelectMany(it => it.Value).ToArray();
  618. var resulut = this.Context.Queryable<object>().AS(UtilMethods.GetPackTable(allSql, "unionTable")).With(SqlWith.Null);
  619. resulut.AddParameters(allParameters);
  620. if (this.Context.CurrentConnectionConfig.DbType == DbType.Oracle && sqlBuilder.SqlSelectAll == "*")
  621. {
  622. return resulut.Select<T>("unionTable.*");
  623. }
  624. else
  625. {
  626. return resulut.Select<T>(sqlBuilder.SqlSelectAll);
  627. }
  628. }
  629. public virtual ISugarQueryable<T> UnionAll<T>(List<ISugarQueryable<T>> queryables) where T : class, new()
  630. {
  631. Check.Exception(queryables.IsNullOrEmpty(), "UnionAll.queryables is null ");
  632. return UnionAll(queryables.ToArray());
  633. }
  634. public virtual ISugarQueryable<T> Union<T>(params ISugarQueryable<T>[] queryables) where T : class, new()
  635. {
  636. var sqlBuilder = InstanceFactory.GetSqlbuilder(this.Context.CurrentConnectionConfig);
  637. Check.Exception(queryables.IsNullOrEmpty(), "UnionAll.queryables is null ");
  638. int i = 1;
  639. List<KeyValuePair<string, List<SugarParameter>>> allItems = new List<KeyValuePair<string, List<SugarParameter>>>();
  640. foreach (var item in queryables)
  641. {
  642. item.QueryBuilder.DisableTop = true;
  643. var sqlObj = item.ToSql();
  644. string sql = sqlObj.Key;
  645. if (this.CurrentConnectionConfig?.MoreSettings?.MaxParameterNameLength > 0)
  646. {
  647. UtilMethods.RepairReplicationParameters(this.Context, ref sql, sqlObj.Value.ToArray(), i, "Union");
  648. }
  649. else
  650. {
  651. UtilMethods.RepairReplicationParameters(ref sql, sqlObj.Value.ToArray(), i, "Union");
  652. }
  653. if (sqlObj.Value.HasValue())
  654. allItems.Add(new KeyValuePair<string, List<SugarParameter>>(sqlBuilder.GetUnionFomatSql(sql), sqlObj.Value));
  655. else
  656. allItems.Add(new KeyValuePair<string, List<SugarParameter>>(sqlBuilder.GetUnionFomatSql(sql), new List<SugarParameter>()));
  657. i++;
  658. }
  659. var allSql = sqlBuilder.GetUnionSql(allItems.Select(it => it.Key).ToList());
  660. var allParameters = allItems.SelectMany(it => it.Value).ToArray();
  661. var resulut = this.Context.Queryable<object>().AS(UtilMethods.GetPackTable(allSql, "unionTable")).With(SqlWith.Null);
  662. resulut.AddParameters(allParameters);
  663. if (this.Context.CurrentConnectionConfig.DbType == DbType.Oracle && sqlBuilder.SqlSelectAll == "*")
  664. {
  665. return resulut.Select<T>("unionTable.*");
  666. }
  667. else
  668. {
  669. return resulut.Select<T>(sqlBuilder.SqlSelectAll);
  670. }
  671. }
  672. public virtual ISugarQueryable<T> Union<T>(List<ISugarQueryable<T>> queryables) where T : class, new()
  673. {
  674. Check.Exception(queryables.IsNullOrEmpty(), "Union.queryables is null ");
  675. return Union(queryables.ToArray());
  676. }
  677. #endregion
  678. #region SqlQueryable
  679. public ISugarQueryable<T> SqlQueryable<T>(string sql) where T : class, new()
  680. {
  681. var sqlBuilder = InstanceFactory.GetSqlbuilder(this.Context.CurrentConnectionConfig);
  682. var result= this.Context.Queryable<T>().AS(sqlBuilder.GetPackTable(sql, sqlBuilder.GetDefaultShortName())).With(SqlWith.Null).Select(sqlBuilder.GetDefaultShortName() + ".*");
  683. result.QueryBuilder.IsSqlQuery = true;
  684. result.QueryBuilder.OldSql = sql;
  685. result.QueryBuilder.NoCheckInclude = true;
  686. return result;
  687. }
  688. #endregion
  689. #region Insertable
  690. public IInsertable<Dictionary<string, object>> InsertableByDynamic(object insertDynamicObject)
  691. {
  692. return this.Insertable<Dictionary<string, object>>(insertDynamicObject);
  693. }
  694. public InsertMethodInfo InsertableByObject(object singleEntityObjectOrListObject)
  695. {
  696. if (singleEntityObjectOrListObject == null)
  697. return new InsertMethodInfo();
  698. if (singleEntityObjectOrListObject.GetType().FullName.IsCollectionsList())
  699. {
  700. var list = ((IList)singleEntityObjectOrListObject);
  701. if (list == null || list.Count == 0)
  702. return new InsertMethodInfo();
  703. var type = list[0].GetType();
  704. var newList = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(type));
  705. foreach (var item in list)
  706. {
  707. newList.Add(item);
  708. }
  709. var methods = this.Context.GetType().GetMethods()
  710. .Where(it => it.Name == "Insertable")
  711. .Where(it => it.GetGenericArguments().Any())
  712. .Where(it => it.GetParameters().Any(z => z.ParameterType.Name.StartsWith("List")))
  713. .Where(it => it.Name == "Insertable").ToList();
  714. var method = methods.Single().MakeGenericMethod(newList.GetType().GetGenericArguments().First());
  715. InsertMethodInfo result = new InsertMethodInfo()
  716. {
  717. Context = this.Context,
  718. MethodInfo = method,
  719. objectValue = newList
  720. };
  721. return result;
  722. }
  723. else
  724. {
  725. var methods = this.Context.GetType().GetMethods()
  726. .Where(it => it.Name == "Insertable")
  727. .Where(it => it.GetGenericArguments().Any())
  728. .Where(it => it.GetParameters().Any(z => z.ParameterType.Name == "T"))
  729. .Where(it => it.Name == "Insertable").ToList();
  730. var method = methods.Single().MakeGenericMethod(singleEntityObjectOrListObject.GetType());
  731. InsertMethodInfo result = new InsertMethodInfo()
  732. {
  733. Context = this.Context,
  734. MethodInfo = method,
  735. objectValue = singleEntityObjectOrListObject
  736. };
  737. return result;
  738. }
  739. }
  740. public virtual IInsertable<T> Insertable<T>(T[] insertObjs) where T : class, new()
  741. {
  742. UtilMethods.CheckArray(insertObjs);
  743. InitMappingInfo<T>();
  744. InsertableProvider<T> result = this.CreateInsertable(insertObjs);
  745. return result;
  746. }
  747. public virtual IInsertable<T> Insertable<T>(List<T> insertObjs) where T : class, new()
  748. {
  749. if (insertObjs == null || insertObjs.IsNullOrEmpty())
  750. {
  751. insertObjs = new List<T>();
  752. insertObjs.Add(default(T));
  753. }
  754. return this.Context.Insertable(insertObjs.ToArray());
  755. }
  756. public virtual IInsertable<T> Insertable<T>(T insertObj) where T : class, new()
  757. {
  758. return this.Context.Insertable(new T[] { insertObj });
  759. }
  760. public virtual IInsertable<T> Insertable<T>(Dictionary<string, object> columnDictionary) where T : class, new()
  761. {
  762. InitMappingInfo<T>();
  763. Check.Exception(columnDictionary == null || columnDictionary.Count == 0, "Insertable.columnDictionary can't be null");
  764. var insertObject = this.Context.Utilities.DeserializeObject<T>(this.Context.Utilities.SerializeObject(columnDictionary));
  765. var columns = columnDictionary.Select(it => it.Key).ToList();
  766. return this.Context.Insertable(insertObject).InsertColumns(columns.ToArray()); ;
  767. }
  768. public virtual IInsertable<T> Insertable<T>(dynamic insertDynamicObject) where T : class, new()
  769. {
  770. InitMappingInfo<T>();
  771. if (insertDynamicObject is T)
  772. {
  773. return this.Context.Insertable((T)insertDynamicObject);
  774. }
  775. else
  776. {
  777. var columns = ((object)insertDynamicObject).GetType().GetProperties().Select(it => it.Name).ToList();
  778. Check.Exception(columns.IsNullOrEmpty(), "Insertable.updateDynamicObject can't be null");
  779. T insertObject = this.Context.Utilities.DeserializeObject<T>(this.Context.Utilities.SerializeObject(insertDynamicObject));
  780. return this.Context.Insertable(insertObject).InsertColumns(columns.ToArray());
  781. }
  782. }
  783. #endregion
  784. #region Deleteable
  785. public DeleteMethodInfo DeleteableByObject(object singleEntityObjectOrListObject)
  786. {
  787. if (singleEntityObjectOrListObject == null)
  788. return new DeleteMethodInfo();
  789. if (singleEntityObjectOrListObject.GetType().FullName.IsCollectionsList())
  790. {
  791. var list = ((IList)singleEntityObjectOrListObject);
  792. if (list == null || list.Count == 0)
  793. return new DeleteMethodInfo();
  794. var type = list[0].GetType();
  795. var newList = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(type));
  796. foreach (var item in list)
  797. {
  798. newList.Add(item);
  799. }
  800. var methods = this.Context.GetType().GetMethods()
  801. .Where(it => it.Name == "Deleteable")
  802. .Where(it => it.GetGenericArguments().Any())
  803. .Where(it => it.GetParameters().Any(z =>z.Name!= "pkValue" && z.ParameterType.Name.StartsWith("List")))
  804. .Where(it => it.Name == "Deleteable").ToList();
  805. var method = methods.FirstOrDefault().MakeGenericMethod(newList.GetType().GetGenericArguments().FirstOrDefault());
  806. DeleteMethodInfo result = new DeleteMethodInfo()
  807. {
  808. Context = this.Context,
  809. MethodInfo = method,
  810. objectValue = newList
  811. };
  812. return result;
  813. }
  814. else
  815. {
  816. var methods = this.Context.GetType().GetMethods()
  817. .Where(it => it.Name == "Deleteable")
  818. .Where(it => it.GetGenericArguments().Any())
  819. .Where(it => it.GetParameters().Any(z => z.ParameterType.Name == "T"))
  820. .Where(it => it.Name == "Deleteable").ToList();
  821. var method = methods.Single().MakeGenericMethod(singleEntityObjectOrListObject.GetType());
  822. DeleteMethodInfo result = new DeleteMethodInfo()
  823. {
  824. Context = this.Context,
  825. MethodInfo = method,
  826. objectValue = singleEntityObjectOrListObject
  827. };
  828. return result;
  829. }
  830. }
  831. public virtual IDeleteable<T> Deleteable<T>() where T : class, new()
  832. {
  833. InitMappingInfo<T>();
  834. DeleteableProvider<T> result = this.CreateDeleteable<T>();
  835. if (this.Context.CurrentConnectionConfig?.MoreSettings?.IsAutoDeleteQueryFilter == true)
  836. {
  837. return result.EnableQueryFilter();
  838. }
  839. return result;
  840. }
  841. public virtual IDeleteable<T> Deleteable<T>(Expression<Func<T, bool>> expression) where T : class, new()
  842. {
  843. InitMappingInfo<T>();
  844. return this.Context.Deleteable<T>().Where(expression);
  845. }
  846. public virtual IDeleteable<T> Deleteable<T>(dynamic primaryKeyValue) where T : class, new()
  847. {
  848. InitMappingInfo<T>();
  849. return this.Context.Deleteable<T>().In(primaryKeyValue);
  850. }
  851. public virtual IDeleteable<T> Deleteable<T>(dynamic[] primaryKeyValues) where T : class, new()
  852. {
  853. InitMappingInfo<T>();
  854. return this.Context.Deleteable<T>().In(primaryKeyValues);
  855. }
  856. public virtual IDeleteable<T> Deleteable<T>(List<dynamic> pkValue) where T : class, new()
  857. {
  858. InitMappingInfo<T>();
  859. return this.Context.Deleteable<T>().In(pkValue);
  860. }
  861. public virtual IDeleteable<T> Deleteable<T>(T deleteObj) where T : class, new()
  862. {
  863. InitMappingInfo<T>();
  864. return this.Context.Deleteable<T>().Where(deleteObj);
  865. }
  866. public virtual IDeleteable<T> Deleteable<T>(List<T> deleteObjs) where T : class, new()
  867. {
  868. InitMappingInfo<T>();
  869. return this.Context.Deleteable<T>().Where(deleteObjs);
  870. }
  871. #endregion
  872. #region Updateable
  873. public UpdateMethodInfo UpdateableByObject(object singleEntityObjectOrListObject)
  874. {
  875. if (singleEntityObjectOrListObject == null)
  876. return new UpdateMethodInfo();
  877. if (singleEntityObjectOrListObject.GetType().FullName.IsCollectionsList())
  878. {
  879. var list = ((IList)singleEntityObjectOrListObject);
  880. if (list == null || list.Count == 0)
  881. return new UpdateMethodInfo();
  882. var type = list[0].GetType();
  883. var newList = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(type));
  884. foreach (var item in list)
  885. {
  886. newList.Add(item);
  887. }
  888. var methods = this.Context.GetType().GetMethods()
  889. .Where(it => it.Name == "Updateable")
  890. .Where(it => it.GetGenericArguments().Any())
  891. .Where(it => it.GetParameters().Any(z => z.ParameterType.Name.StartsWith("List")))
  892. .Where(it => it.Name == "Updateable").ToList();
  893. var method = methods.Single().MakeGenericMethod(newList.GetType().GetGenericArguments().First());
  894. UpdateMethodInfo result = new UpdateMethodInfo()
  895. {
  896. Context = this.Context,
  897. MethodInfo = method,
  898. objectValue = newList
  899. };
  900. return result;
  901. }
  902. else
  903. {
  904. var methods = this.Context.GetType().GetMethods()
  905. .Where(it => it.Name == "Updateable")
  906. .Where(it => it.GetGenericArguments().Any())
  907. .Where(it => it.GetParameters().Any(z => z.ParameterType.Name == "T"))
  908. .Where(it => it.Name == "Updateable").ToList();
  909. var method = methods.Single().MakeGenericMethod(singleEntityObjectOrListObject.GetType());
  910. UpdateMethodInfo result = new UpdateMethodInfo()
  911. {
  912. Context = this.Context,
  913. MethodInfo = method,
  914. objectValue = singleEntityObjectOrListObject
  915. };
  916. return result;
  917. }
  918. }
  919. public UpdateExpressionMethodInfo UpdateableByObject(Type entityType)
  920. {
  921. UpdateExpressionMethodInfo reslut = new UpdateExpressionMethodInfo();
  922. var methods = this.Context.GetType().GetMethods()
  923. .Where(it => it.Name == "Updateable")
  924. .Where(it => it.GetGenericArguments().Any())
  925. .Where(it => !it.GetParameters().Any())
  926. .Where(it => it.Name == "Updateable").ToList();
  927. var method = methods.Single().MakeGenericMethod(entityType);
  928. reslut.Context = this.Context;
  929. reslut.MethodInfo = method;
  930. reslut.Type = entityType;
  931. reslut.objectValue = method.Invoke(Context, new object[] { });
  932. return reslut;
  933. }
  934. public virtual IUpdateable<T> Updateable<T>(T[] UpdateObjs) where T : class, new()
  935. {
  936. InitMappingInfo<T>();
  937. Check.ExceptionEasy(UpdateObjs is IList&&typeof(T).FullName.IsCollectionsList(), "The methods you encapsulate are loaded incorrectly, so List<T> should be Updateable<T>(List<T> UpdateObjs)where T: class, new()", "你封装的方法进错重载,List<T>应该进Updateable<T>(List<T> UpdateObjs)where T : class, new()重载");
  938. UpdateableProvider<T> result = this.CreateUpdateable(UpdateObjs);
  939. return result;
  940. }
  941. public virtual IUpdateable<T> Updateable<T>(List<T> UpdateObjs) where T : class, new()
  942. {
  943. //Check.ArgumentNullException(UpdateObjs, "Updateable.UpdateObjs can't be null");
  944. if (UpdateObjs == null)
  945. {
  946. UpdateObjs = new List<T>();
  947. }
  948. var result= (UpdateableProvider<T>)Updateable(UpdateObjs.ToArray());
  949. result.UpdateBuilder.IsListUpdate = true;
  950. return result;
  951. }
  952. public virtual IUpdateable<T> Updateable<T>(T UpdateObj) where T : class, new()
  953. {
  954. return this.Context.Updateable(new T[] { UpdateObj });
  955. }
  956. public virtual IUpdateable<T> Updateable<T>() where T : class, new()
  957. {
  958. var result = this.Context.Updateable(new T[] { new T() });
  959. result.UpdateParameterIsNull = true;
  960. if (this.Context.CurrentConnectionConfig?.MoreSettings?.IsAutoUpdateQueryFilter == true)
  961. {
  962. return result.EnableQueryFilter();
  963. }
  964. return result;
  965. }
  966. public virtual IUpdateable<T> Updateable<T>(Expression<Func<T, T>> columns) where T : class, new()
  967. {
  968. var result = this.Context.Updateable<T>().SetColumns(columns);
  969. result.UpdateParameterIsNull = true;
  970. return result;
  971. }
  972. public virtual IUpdateable<T> Updateable<T>(Expression<Func<T, bool>> columns) where T : class, new()
  973. {
  974. var result = this.Context.Updateable<T>().SetColumns(columns);
  975. result.UpdateParameterIsNull = true;
  976. return result;
  977. }
  978. public IUpdateable<Dictionary<string, object>> UpdateableByDynamic(object updateDynamicObject)
  979. {
  980. return this.Updateable<Dictionary<string, object>>(updateDynamicObject);
  981. }
  982. public virtual IUpdateable<T> Updateable<T>(Dictionary<string, object> columnDictionary) where T : class, new()
  983. {
  984. InitMappingInfo<T>();
  985. Check.Exception(columnDictionary == null || columnDictionary.Count == 0, "Updateable.columnDictionary can't be null");
  986. var updateObject = this.Context.Utilities.DeserializeObject<T>(this.Context.Utilities.SerializeObject(columnDictionary));
  987. var columns = columnDictionary.Select(it => it.Key).ToList();
  988. return this.Context.Updateable(updateObject).UpdateColumns(columns.ToArray()); ;
  989. }
  990. public virtual IUpdateable<T> Updateable<T>(dynamic updateDynamicObject) where T : class, new()
  991. {
  992. InitMappingInfo<T>();
  993. if (updateDynamicObject is T)
  994. {
  995. return this.Context.Updateable((T)updateDynamicObject);
  996. }
  997. else
  998. {
  999. var columns = ((object)updateDynamicObject).GetType().GetProperties().Select(it => it.Name).ToList();
  1000. Check.Exception(columns.IsNullOrEmpty(), "Updateable.updateDynamicObject can't be null");
  1001. T updateObject = this.Context.Utilities.DeserializeObject<T>(this.Context.Utilities.SerializeObject(updateDynamicObject));
  1002. return this.Context.Updateable(updateObject).UpdateColumns(columns.ToArray()); ;
  1003. }
  1004. }
  1005. #endregion
  1006. #region Saveable
  1007. public GridSaveProvider<T> GridSave<T>(List<T> saveList) where T : class, new()
  1008. {
  1009. Check.ExceptionEasy(saveList == null, "saveList is null", "saveList 不能是 null");
  1010. var isTran = this.Context.TempItems != null
  1011. && this.Context.TempItems.Any(it => it.Key == "OldData_" + saveList.GetHashCode());
  1012. Check.ExceptionEasy(isTran == false, "saveList no tracking", "saveList 没有使用跟踪");
  1013. var oldList = (List<T>)this.Context.TempItems.FirstOrDefault(it => it.Key == "OldData_" + saveList.GetHashCode()).Value;
  1014. return GridSave(oldList, saveList);
  1015. }
  1016. public GridSaveProvider<T> GridSave<T>(List<T> oldList, List<T> saveList) where T : class, new()
  1017. {
  1018. GridSaveProvider<T> result = new GridSaveProvider<T>();
  1019. result.Context = this;
  1020. result.OldList = oldList;
  1021. result.SaveList = saveList;
  1022. return result;
  1023. }
  1024. public IStorageable<T> Storageable<T>(T[] dataList) where T : class, new()
  1025. {
  1026. return Storageable(dataList?.ToList());
  1027. }
  1028. public ISaveable<T> Saveable<T>(List<T> saveObjects) where T : class, new()
  1029. {
  1030. return new SaveableProvider<T>(this, saveObjects);
  1031. }
  1032. public ISaveable<T> Saveable<T>(T saveObject) where T : class, new()
  1033. {
  1034. return new SaveableProvider<T>(this, saveObject);
  1035. }
  1036. public StorageableDataTable Storageable(List<Dictionary<string, object>> dictionaryList, string tableName)
  1037. {
  1038. DataTable dt = this.Context.Utilities.DictionaryListToDataTable(dictionaryList);
  1039. dt.TableName = tableName;
  1040. return this.Context.Storageable(dt);
  1041. }
  1042. public StorageableDataTable Storageable(Dictionary<string, object> dictionary, string tableName)
  1043. {
  1044. DataTable dt = this.Context.Utilities.DictionaryListToDataTable(new List<Dictionary<string, object>>() { dictionary });
  1045. dt.TableName = tableName;
  1046. return this.Context.Storageable(dt);
  1047. }
  1048. public IStorageable<T> Storageable<T>(List<T> dataList) where T : class, new()
  1049. {
  1050. dataList = dataList.Where(it => it != null).ToList();
  1051. this.InitMappingInfo<T>();
  1052. var sqlBuilder = InstanceFactory.GetSqlbuilder(this.Context.CurrentConnectionConfig);
  1053. var result= new Storageable<T>(dataList,this);
  1054. result.Builder = sqlBuilder;
  1055. return result;
  1056. }
  1057. public IStorageable<T> Storageable<T>(IList<T> dataList) where T : class, new()
  1058. {
  1059. return Storageable(dataList?.ToList());
  1060. }
  1061. public IStorageable<T> Storageable<T>(T data) where T : class, new()
  1062. {
  1063. return Storageable(new List<T>() { data });
  1064. }
  1065. public StorageableDataTable Storageable(DataTable data)
  1066. {
  1067. var result = new StorageableDataTable();
  1068. Check.Exception(data.TableName.IsNullOrEmpty() || data.TableName == "Table",ErrorMessage.GetThrowMessage( "DataTable data.TableName is null", "参数DataTable没有设置TableName ,参数.TableName=表名"));
  1069. result.DataTable = data;
  1070. result.Context = this;
  1071. data.Columns.Add(new DataColumn("SugarGroupId", typeof(StorageType)));
  1072. data.Columns.Add(new DataColumn("SugarUpdateRows", typeof(List<DataRow>)));
  1073. data.Columns.Add(new DataColumn("SugarErrorMessage", typeof(string)));
  1074. data.Columns.Add(new DataColumn("SugarColumns", typeof(string[])));
  1075. return result;
  1076. }
  1077. public StorageableMethodInfo StorageableByObject(object singleEntityObjectOrList)
  1078. {
  1079. if (singleEntityObjectOrList == null)
  1080. return new StorageableMethodInfo();
  1081. if (singleEntityObjectOrList.GetType().FullName.IsCollectionsList())
  1082. {
  1083. var list = ((IList)singleEntityObjectOrList);
  1084. if(list==null|| list.Count==0)
  1085. return new StorageableMethodInfo();
  1086. var type=list[0].GetType();
  1087. var newList = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(type)) ;
  1088. foreach (var item in list)
  1089. {
  1090. newList.Add(item);
  1091. }
  1092. var methods = this.Context.GetType().GetMethods()
  1093. .Where(it => it.Name == "Storageable")
  1094. .Where(it => it.GetGenericArguments().Any())
  1095. .Where(it => it.GetParameters().Any(z => z.ParameterType.Name.StartsWith("List")))
  1096. .Where(it => it.Name == "Storageable").ToList();
  1097. var method = methods.Single().MakeGenericMethod(newList.GetType().GetGenericArguments().First());
  1098. StorageableMethodInfo result = new StorageableMethodInfo()
  1099. {
  1100. Context = this.Context,
  1101. MethodInfo = method,
  1102. objectValue = newList
  1103. };
  1104. return result;
  1105. }
  1106. else
  1107. {
  1108. var methods = this.Context.GetType().GetMethods()
  1109. .Where(it => it.Name == "Storageable")
  1110. .Where(it => it.GetGenericArguments().Any())
  1111. .Where(it => it.GetParameters().Any(z => z.ParameterType.Name == "T"))
  1112. .Where(it => it.Name == "Storageable").ToList();
  1113. var method = methods.Single().MakeGenericMethod(singleEntityObjectOrList.GetType());
  1114. StorageableMethodInfo result = new StorageableMethodInfo()
  1115. {
  1116. Context = this.Context,
  1117. MethodInfo = method,
  1118. objectValue = singleEntityObjectOrList
  1119. };
  1120. return result;
  1121. }
  1122. }
  1123. #endregion
  1124. #region Reportable
  1125. public IReportable<T> Reportable<T>(T data)
  1126. {
  1127. var result = new ReportableProvider<T>(data);
  1128. result.formatBuilder = InstanceFactory.GetInsertBuilder(this.Context.CurrentConnectionConfig);
  1129. result.Context = this;
  1130. result.formatBuilder.Context = this;
  1131. result.queryBuilder = this.Queryable<object>().QueryBuilder;
  1132. return result;
  1133. }
  1134. public IReportable<T> Reportable<T>(List<T> list)
  1135. {
  1136. var result = new ReportableProvider<T>(list);
  1137. result.formatBuilder = InstanceFactory.GetInsertBuilder(this.Context.CurrentConnectionConfig);
  1138. result.Context = this;
  1139. result.formatBuilder.Context = this;
  1140. result.queryBuilder = this.Queryable<object>().QueryBuilder;
  1141. return result;
  1142. }
  1143. public IReportable<T> Reportable<T>(T [] list)
  1144. {
  1145. if (list == null)
  1146. list = new T[] { };
  1147. var result = new ReportableProvider<T>(list.ToList());
  1148. result.formatBuilder = InstanceFactory.GetInsertBuilder(this.Context.CurrentConnectionConfig);
  1149. result.Context = this;
  1150. result.formatBuilder.Context = this;
  1151. result.queryBuilder = this.Queryable<object>().QueryBuilder;
  1152. return result;
  1153. }
  1154. #endregion
  1155. #region Nav CUD
  1156. public InsertNavTaskInit<T, T> InsertNav<T>(T data) where T : class, new()
  1157. {
  1158. return InsertNav(new List<T>() { data });
  1159. }
  1160. public InsertNavTaskInit<T, T> InsertNav<T>(List<T> datas) where T : class, new()
  1161. {
  1162. var result = new InsertNavTaskInit<T, T>();
  1163. var provider = new InsertNavProvider<T, T>();
  1164. provider._Roots = datas;
  1165. provider._Context = this;
  1166. result.insertNavProvider = provider;
  1167. result.NavContext = new NavContext() { Items = new List<NavContextItem>() };
  1168. return result;
  1169. }
  1170. public InsertNavTaskInit<T, T> InsertNav<T>(T data, InsertNavRootOptions rootOptions) where T : class, new()
  1171. {
  1172. return InsertNav(new List<T>() { data },rootOptions); ;
  1173. }
  1174. public InsertNavTaskInit<T, T> InsertNav<T>(List<T> datas, InsertNavRootOptions rootOptions) where T : class, new()
  1175. {
  1176. var result = new InsertNavTaskInit<T, T>();
  1177. var provider = new InsertNavProvider<T, T>();
  1178. provider._Roots = datas;
  1179. provider._Context = this;
  1180. provider._RootOptions = rootOptions;
  1181. result.insertNavProvider = provider;
  1182. result.NavContext = new NavContext() { Items = new List<NavContextItem>() };
  1183. return result;
  1184. }
  1185. public DeleteNavTaskInit<T, T> DeleteNav<T>(T data) where T : class, new()
  1186. {
  1187. return DeleteNav(new List<T>() { data });
  1188. }
  1189. public DeleteNavTaskInit<T, T> DeleteNav<T>(List<T> datas) where T : class, new()
  1190. {
  1191. var result = new DeleteNavTaskInit<T, T>();
  1192. result.deleteNavProvider = new DeleteNavProvider<T, T>();
  1193. result.deleteNavProvider._Roots = datas;
  1194. result.deleteNavProvider._Context = this;
  1195. return result;
  1196. }
  1197. public DeleteNavTaskInit<T, T> DeleteNav<T>(Expression<Func<T, bool>> whereExpression) where T : class, new()
  1198. {
  1199. return DeleteNav(this.Queryable<T>().Where(whereExpression).ToList());
  1200. }
  1201. public DeleteNavTaskInit<T, T> DeleteNav<T>(T data, DeleteNavRootOptions options) where T : class, new()
  1202. {
  1203. return DeleteNav(new List<T>() { data }, options);
  1204. }
  1205. public DeleteNavTaskInit<T, T> DeleteNav<T>(List<T> datas, DeleteNavRootOptions options) where T : class, new()
  1206. {
  1207. var result = new DeleteNavTaskInit<T, T>();
  1208. result.deleteNavProvider = new DeleteNavProvider<T, T>();
  1209. result.deleteNavProvider._Roots = datas;
  1210. result.deleteNavProvider._Context = this;
  1211. result.deleteNavProvider._RootOptions = options;
  1212. return result;
  1213. }
  1214. public DeleteNavTaskInit<T, T> DeleteNav<T>(Expression<Func<T, bool>> whereExpression, DeleteNavRootOptions options) where T : class, new()
  1215. {
  1216. return DeleteNav(this.Queryable<T>().Where(whereExpression).ToList(),options);
  1217. }
  1218. public UpdateNavTaskInit<T, T> UpdateNav<T>(T data) where T : class, new()
  1219. {
  1220. return UpdateNav(new List<T>() { data });
  1221. }
  1222. public UpdateNavTaskInit<T, T> UpdateNav<T>(List<T> datas) where T : class, new()
  1223. {
  1224. var result = new UpdateNavTaskInit<T, T>();
  1225. var provider = new UpdateNavProvider<T, T>();
  1226. provider._Roots = datas;
  1227. provider._Context = this;
  1228. result.UpdateNavProvider = provider;
  1229. result.NavContext = new NavContext() { Items = new List<NavContextItem>() { } };
  1230. return result;
  1231. }
  1232. public UpdateNavTaskInit<T, T> UpdateNav<T>(T data, UpdateNavRootOptions rootOptions) where T : class, new()
  1233. {
  1234. return UpdateNav(new List<T>() { data},rootOptions);
  1235. }
  1236. public UpdateNavTaskInit<T, T> UpdateNav<T>(List<T> datas, UpdateNavRootOptions rootOptions) where T : class, new()
  1237. {
  1238. var result = new UpdateNavTaskInit<T, T>();
  1239. var provider = new UpdateNavProvider<T, T>();
  1240. provider._Roots = datas;
  1241. provider._RootOptions = rootOptions;
  1242. provider._Context = this;
  1243. result.UpdateNavProvider = provider;
  1244. result.NavContext = new NavContext() { Items = new List<NavContextItem>() { } };
  1245. return result; ;
  1246. }
  1247. #endregion
  1248. #region DbFirst
  1249. public virtual IDbFirst DbFirst
  1250. {
  1251. get
  1252. {
  1253. IDbFirst dbFirst = InstanceFactory.GetDbFirst(this.Context.CurrentConnectionConfig);
  1254. dbFirst.Context = this.Context;
  1255. dbFirst.Init();
  1256. return dbFirst;
  1257. }
  1258. }
  1259. #endregion
  1260. #region CodeFirst
  1261. public virtual ICodeFirst CodeFirst
  1262. {
  1263. get
  1264. {
  1265. ICodeFirst codeFirst = InstanceFactory.GetCodeFirst(this.Context.CurrentConnectionConfig);
  1266. codeFirst.Context = this;
  1267. return codeFirst;
  1268. }
  1269. }
  1270. #endregion
  1271. #region Db Maintenance
  1272. public virtual IDbMaintenance DbMaintenance
  1273. {
  1274. get
  1275. {
  1276. if (this._DbMaintenance == null)
  1277. {
  1278. IDbMaintenance maintenance = InstanceFactory.GetDbMaintenance(this.Context.CurrentConnectionConfig);
  1279. this._DbMaintenance = maintenance;
  1280. maintenance.Context = this;
  1281. }
  1282. return this._DbMaintenance;
  1283. }
  1284. }
  1285. #endregion
  1286. #region Entity Maintenance
  1287. public virtual EntityMaintenance EntityMaintenance
  1288. {
  1289. get
  1290. {
  1291. if (this._EntityProvider == null)
  1292. {
  1293. this._EntityProvider = new EntityMaintenance();
  1294. this._EntityProvider.Context = this;
  1295. }
  1296. return this._EntityProvider;
  1297. }
  1298. set { this._EntityProvider = value; }
  1299. }
  1300. #endregion
  1301. #region Gobal Filter
  1302. public virtual QueryFilterProvider QueryFilter
  1303. {
  1304. get
  1305. {
  1306. if (this._QueryFilterProvider == null)
  1307. {
  1308. this._QueryFilterProvider = new QueryFilterProvider();
  1309. this._QueryFilterProvider.Context = this;
  1310. }
  1311. return this._QueryFilterProvider;
  1312. }
  1313. set { this._QueryFilterProvider = value; }
  1314. }
  1315. #endregion
  1316. #region SimpleClient
  1317. public T CreateContext<T>(bool isTran) where T : SugarUnitOfWork, new()
  1318. {
  1319. Check.ExceptionEasy(" var childDb=Db.GetConnection(configId); use Db.CreateContext ", " 例如 var childDb=Db.GetConnection(configId);其中Db才能使用CreateContext,childDb不能使用");
  1320. return null;
  1321. }
  1322. public SugarUnitOfWork CreateContext(bool isTran = true)
  1323. {
  1324. Check.ExceptionEasy(" var childDb=Db.GetConnection(configId); use Db.CreateContext ", " 例如 var childDb=Db.GetConnection(configId);其中Db才能使用CreateContext,childDb不能使用");
  1325. return null;
  1326. }
  1327. //[Obsolete("Use SqlSugarClient.GetSimpleClient() Or SqlSugarClient.GetSimpleClient<T>() ")]
  1328. //public virtual SimpleClient SimpleClient
  1329. //{
  1330. // get
  1331. // {
  1332. // if (this._SimpleClient == null)
  1333. // this._SimpleClient = new SimpleClient(this);
  1334. // return this._SimpleClient;
  1335. // }
  1336. //}
  1337. public virtual SimpleClient<T> GetSimpleClient<T>() where T : class, new()
  1338. {
  1339. return new SimpleClient<T>(this);
  1340. }
  1341. public RepositoryType GetRepository<RepositoryType>() where RepositoryType : ISugarRepository, new()
  1342. {
  1343. Type type = typeof(RepositoryType);
  1344. var isAnyParamter = type.GetConstructors().Any(z => z.GetParameters().Any());
  1345. object o = null;
  1346. if (isAnyParamter)
  1347. {
  1348. o = Activator.CreateInstance(type, new string[] { null });
  1349. }
  1350. else
  1351. {
  1352. o = Activator.CreateInstance(type);
  1353. }
  1354. var result = (RepositoryType)o;
  1355. if (result.Context == null)
  1356. {
  1357. result.Context = this.Context;
  1358. }
  1359. return result;
  1360. }
  1361. //public virtual SimpleClient GetSimpleClient()
  1362. //{
  1363. // if (this._SimpleClient == null)
  1364. // this._SimpleClient = new SimpleClient(this);
  1365. // return this._SimpleClient;
  1366. //}
  1367. #endregion
  1368. #region Dispose OR Close
  1369. public virtual void Close()
  1370. {
  1371. if (this.Context.Ado != null)
  1372. this.Context.Ado.Close();
  1373. }
  1374. public virtual void Open()
  1375. {
  1376. if (this.Context.Ado != null)
  1377. this.Context.Ado.Open();
  1378. }
  1379. public virtual void Dispose()
  1380. {
  1381. if (this.Context.Ado != null)
  1382. this.Context.Ado.Dispose();
  1383. }
  1384. #endregion
  1385. #region Queue
  1386. public int SaveQueues(bool isTran = true)
  1387. {
  1388. return SaveQueuesProvider(isTran, (sql, parameters) => { return this.Ado.ExecuteCommand(sql, parameters); });
  1389. }
  1390. public async Task<int> SaveQueuesAsync(bool isTran = true)
  1391. {
  1392. return await SaveQueuesProviderAsync(isTran, (sql, parameters) => { return this.Ado.ExecuteCommandAsync(sql, parameters); });
  1393. }
  1394. public List<T> SaveQueues<T>(bool isTran = true)
  1395. {
  1396. return SaveQueuesProvider(isTran, (sql, parameters) => { return this.Ado.SqlQuery<T>(sql, parameters); });
  1397. }
  1398. public async Task<List<T>> SaveQueuesAsync<T>(bool isTran = true)
  1399. {
  1400. return await SaveQueuesProviderAsync(isTran, (sql, parameters) => { return this.Ado.SqlQueryAsync<T>(sql, parameters); });
  1401. }
  1402. public Tuple<List<T>, List<T2>> SaveQueues<T, T2>(bool isTran = true)
  1403. {
  1404. return SaveQueuesProvider(isTran, (sql, parameters) => { return this.Ado.SqlQuery<T, T2>(sql, parameters); });
  1405. }
  1406. public async Task<Tuple<List<T>, List<T2>>> SaveQueuesAsync<T, T2>(bool isTran = true)
  1407. {
  1408. return await SaveQueuesProviderAsync(isTran, (sql, parameters) => { return this.Ado.SqlQueryAsync<T, T2>(sql, parameters); });
  1409. }
  1410. public Tuple<List<T>, List<T2>, List<T3>> SaveQueues<T, T2, T3>(bool isTran = true)
  1411. {
  1412. return SaveQueuesProvider(isTran, (sql, parameters) => { return this.Ado.SqlQuery<T, T2, T3>(sql, parameters); });
  1413. }
  1414. public async Task<Tuple<List<T>, List<T2>, List<T3>>> SaveQueuesAsync<T, T2, T3>(bool isTran = true)
  1415. {
  1416. return await SaveQueuesProviderAsync(isTran, (sql, parameters) => { return this.Ado.SqlQueryAsync<T, T2, T3>(sql, parameters); });
  1417. }
  1418. public Tuple<List<T>, List<T2>, List<T3>, List<T4>> SaveQueues<T, T2, T3, T4>(bool isTran = true)
  1419. {
  1420. return SaveQueuesProvider(isTran, (sql, parameters) => { return this.Ado.SqlQuery<T, T2, T3, T4>(sql, parameters); });
  1421. }
  1422. public async Task<Tuple<List<T>, List<T2>, List<T3>, List<T4>>> SaveQueuesAsync<T, T2, T3, T4>(bool isTran = true)
  1423. {
  1424. return await SaveQueuesProviderAsync(isTran, (sql, parameters) => { return this.Ado.SqlQueryAsync<T, T2, T3, T4>(sql, parameters); });
  1425. }
  1426. public Tuple<List<T>, List<T2>, List<T3>, List<T4>, List<T5>> SaveQueues<T, T2, T3, T4, T5>(bool isTran = true)
  1427. {
  1428. return SaveQueuesProvider(isTran, (sql, parameters) => { return this.Ado.SqlQuery<T, T2, T3, T4, T5>(sql, parameters); });
  1429. }
  1430. public async Task<Tuple<List<T>, List<T2>, List<T3>, List<T4>, List<T5>>> SaveQueuesAsync<T, T2, T3, T4, T5>(bool isTran = true)
  1431. {
  1432. return await SaveQueuesProviderAsync(isTran, (sql, parameters) => { return this.Ado.SqlQueryAsync<T, T2, T3, T4, T5>(sql, parameters); });
  1433. }
  1434. public Tuple<List<T>, List<T2>, List<T3>, List<T4>, List<T5>, List<T6>> SaveQueues<T, T2, T3, T4, T5, T6>(bool isTran = true)
  1435. {
  1436. return SaveQueuesProvider(isTran, (sql, parameters) => { return this.Ado.SqlQuery<T, T2, T3, T4, T5, T6>(sql, parameters); });
  1437. }
  1438. public async Task<Tuple<List<T>, List<T2>, List<T3>, List<T4>, List<T5>, List<T6>>> SaveQueuesAsync<T, T2, T3, T4, T5, T6>(bool isTran = true)
  1439. {
  1440. return await SaveQueuesProviderAsync(isTran, (sql, parameters) => { return this.Ado.SqlQueryAsync<T, T2, T3, T4, T5, T6>(sql, parameters); });
  1441. }
  1442. public Tuple<List<T>, List<T2>, List<T3>, List<T4>, List<T5>, List<T6>, List<T7>> SaveQueues<T, T2, T3, T4, T5, T6, T7>(bool isTran = true)
  1443. {
  1444. return SaveQueuesProvider(isTran, (sql, parameters) => { return this.Ado.SqlQuery<T, T2, T3, T4, T5, T6, T7>(sql, parameters); });
  1445. }
  1446. public async Task<Tuple<List<T>, List<T2>, List<T3>, List<T4>, List<T5>, List<T6>, List<T7>>> SaveQueuesAsync<T, T2, T3, T4, T5, T6, T7>(bool isTran = true)
  1447. {
  1448. return await SaveQueuesProviderAsync(isTran, (sql, parameters) => { return this.Ado.SqlQueryAsync<T, T2, T3, T4, T5, T6, T7>(sql, parameters); });
  1449. }
  1450. public void AddQueue(string sql, object parsmeters = null)
  1451. {
  1452. if (Queues == null)
  1453. {
  1454. Queues = new QueueList();
  1455. }
  1456. var pars = this.Context.Ado.GetParameters(parsmeters);
  1457. if (pars != null)
  1458. {
  1459. foreach (var par in pars)
  1460. {
  1461. if (par.ParameterName.StartsWith(":"))
  1462. {
  1463. par.ParameterName = ("@" + par.ParameterName.Trim(':'));
  1464. }
  1465. }
  1466. }
  1467. this.Queues.Add(sql, pars);
  1468. }
  1469. public void AddQueue(string sql, SugarParameter parsmeter)
  1470. {
  1471. if (Queues == null)
  1472. {
  1473. Queues = new QueueList();
  1474. }
  1475. this.Queues.Add(sql, new List<SugarParameter>() { parsmeter });
  1476. }
  1477. public void AddQueue(string sql, List<SugarParameter> parsmeters)
  1478. {
  1479. if (Queues == null)
  1480. {
  1481. Queues = new QueueList();
  1482. }
  1483. this.Queues.Add(sql, parsmeters);
  1484. }
  1485. public QueueList Queues { get { if (_Queues == null) { _Queues = new QueueList(); } return _Queues; } set { _Queues = value; } }
  1486. private async Task<T> SaveQueuesProviderAsync<T>(bool isTran, Func<string, List<SugarParameter>, Task<T>> func)
  1487. {
  1488. try
  1489. {
  1490. //if (this.CurrentConnectionConfig.DbType == DbType.Oracle)
  1491. //{
  1492. // throw new Exception("Oracle no support SaveQueues");
  1493. //}
  1494. if (this.Queues == null || this.Queues.Count == 0) return default(T);
  1495. isTran = isTran && this.Ado.Transaction == null;
  1496. if (isTran) this.Ado.BeginTran();
  1497. StringBuilder sqlBuilder = new StringBuilder();
  1498. var parsmeters = new List<SugarParameter>();
  1499. var index = 1;
  1500. if (this.Queues.HasValue())
  1501. {
  1502. var repeatList =
  1503. Queues.SelectMany(it => it.Parameters ?? new SugarParameter[] { }).Select(it => it.ParameterName)
  1504. .GroupBy(it => it?.ToLower())
  1505. .Where(it => it.Count() > 1);
  1506. var repeatCount = repeatList.Count();
  1507. var isParameterNameRepeat = repeatList
  1508. .Count() > 0;
  1509. foreach (var item in Queues)
  1510. {
  1511. if (item.Sql == null)
  1512. item.Sql = string.Empty;
  1513. if (item.Parameters == null)
  1514. item.Parameters = new SugarParameter[] { };
  1515. var itemParsmeters = item.Parameters.OrderByDescending(it => it.ParameterName.Length).ToList();
  1516. List<SugarParameter> addParameters = new List<SugarParameter>();
  1517. var itemSql = item.Sql;
  1518. foreach (var itemParameter in itemParsmeters)
  1519. {
  1520. var newName = itemParameter.ParameterName + "_q_" + index;
  1521. SugarParameter parameter = new SugarParameter(newName, itemParameter.Value);
  1522. parameter.DbType = itemParameter.DbType;
  1523. if (repeatCount>500||(isParameterNameRepeat&& repeatList.Any(it=>it.Key.EqualCase(itemParameter.ParameterName))))
  1524. {
  1525. itemSql = UtilMethods.ReplaceSqlParameter(itemSql, itemParameter, newName);
  1526. addParameters.Add(parameter);
  1527. }
  1528. else
  1529. {
  1530. parameter.ParameterName = itemParameter.ParameterName;
  1531. addParameters.Add(parameter);
  1532. }
  1533. }
  1534. parsmeters.AddRange(addParameters);
  1535. itemSql = itemSql
  1536. .TrimEnd('\r')
  1537. .TrimEnd('\n')
  1538. .TrimEnd('\r')
  1539. .TrimEnd('\n')
  1540. .TrimEnd(';') + ";";
  1541. if (itemSql == "begin;")
  1542. {
  1543. itemSql = itemSql.TrimEnd(';') + "\n";
  1544. }
  1545. sqlBuilder.AppendLine(itemSql);
  1546. index++;
  1547. }
  1548. }
  1549. this.Queues.Clear();
  1550. var builder = InstanceFactory.GetSqlbuilder(this.Context.CurrentConnectionConfig);
  1551. builder.FormatSaveQueueSql(sqlBuilder);
  1552. var result = await func(sqlBuilder.ToString(), parsmeters);
  1553. if (isTran) this.Ado.CommitTran();
  1554. return result;
  1555. }
  1556. catch (Exception ex)
  1557. {
  1558. if (isTran) this.Ado.RollbackTran();
  1559. throw ex;
  1560. }
  1561. }
  1562. private T SaveQueuesProvider<T>(bool isTran, Func<string, List<SugarParameter>, T> func)
  1563. {
  1564. try
  1565. {
  1566. //if (this.CurrentConnectionConfig.DbType == DbType.Oracle)
  1567. //{
  1568. // throw new Exception("Oracle no support SaveQueues");
  1569. //}
  1570. if (this.Queues == null || this.Queues.Count == 0) return default(T);
  1571. isTran = isTran && this.Ado.Transaction == null;
  1572. if (isTran) this.Ado.BeginTran();
  1573. StringBuilder sqlBuilder = new StringBuilder();
  1574. var parsmeters = new List<SugarParameter>();
  1575. var index = 1;
  1576. if (this.Queues.HasValue())
  1577. {
  1578. var repeatList =
  1579. Queues.SelectMany(it => it.Parameters ?? new SugarParameter[] { }).Select(it => it.ParameterName)
  1580. .GroupBy(it => it?.ToLower())
  1581. .Where(it => it.Count() > 1);
  1582. var repeatCount = repeatList.Count();
  1583. var isParameterNameRepeat = repeatList
  1584. .Count() > 0;
  1585. foreach (var item in Queues)
  1586. {
  1587. if (item.Sql == null)
  1588. item.Sql = string.Empty;
  1589. if (item.Parameters == null)
  1590. item.Parameters = new SugarParameter[] { };
  1591. var itemParsmeters = item.Parameters.OrderByDescending(it => it.ParameterName.Length).ToList();
  1592. List<SugarParameter> addParameters = new List<SugarParameter>();
  1593. var itemSql = item.Sql;
  1594. foreach (var itemParameter in itemParsmeters)
  1595. {
  1596. var newName = itemParameter.ParameterName + "_q_" + index;
  1597. SugarParameter parameter = new SugarParameter(newName, itemParameter.Value);
  1598. parameter.DbType = itemParameter.DbType;
  1599. if (repeatCount>500||(isParameterNameRepeat&& repeatList.Any(it=>it.Key.EqualCase(itemParameter.ParameterName))))
  1600. {
  1601. itemSql = UtilMethods.ReplaceSqlParameter(itemSql, itemParameter, newName);
  1602. }
  1603. else
  1604. {
  1605. parameter.ParameterName = itemParameter.ParameterName;
  1606. }
  1607. addParameters.Add(parameter);
  1608. }
  1609. parsmeters.AddRange(addParameters);
  1610. itemSql = itemSql
  1611. .TrimEnd('\r')
  1612. .TrimEnd('\n')
  1613. .TrimEnd('\r')
  1614. .TrimEnd('\n')
  1615. .TrimEnd(';') + ";";
  1616. if (itemSql == "begin;" )
  1617. {
  1618. itemSql = itemSql.TrimEnd(';')+"\n";
  1619. }
  1620. sqlBuilder.AppendLine(itemSql);
  1621. index++;
  1622. }
  1623. }
  1624. this.Queues.Clear();
  1625. var builder = InstanceFactory.GetSqlbuilder(this.Context.CurrentConnectionConfig);
  1626. builder.FormatSaveQueueSql(sqlBuilder);
  1627. var result = func(sqlBuilder.ToString(), parsmeters);
  1628. if (isTran) this.Ado.CommitTran();
  1629. return result;
  1630. }
  1631. catch (Exception ex)
  1632. {
  1633. if (isTran) this.Ado.RollbackTran();
  1634. throw ex;
  1635. }
  1636. }
  1637. #endregion
  1638. #region Cache
  1639. public SugarCacheProvider DataCache
  1640. {
  1641. get {
  1642. var services=this.CurrentConnectionConfig.ConfigureExternalServices;
  1643. if (services == null)
  1644. return new SugarCacheProvider();
  1645. if (services.DataInfoCacheService == null)
  1646. return new SugarCacheProvider();
  1647. SugarCacheProvider cache = new SugarCacheProvider();
  1648. cache.Servie=services.DataInfoCacheService;
  1649. return cache;
  1650. }
  1651. }
  1652. #endregion
  1653. #region Split table
  1654. public SplitTableContext SplitHelper<T>() where T : class, new()
  1655. {
  1656. UtilMethods.StartCustomSplitTable(this, typeof(T));
  1657. var result = new SplitTableContext(this.Context)
  1658. {
  1659. EntityInfo = this.Context.EntityMaintenance.GetEntityInfo<T>()
  1660. };
  1661. return result;
  1662. }
  1663. public SplitTableContext SplitHelper(Type entityType)
  1664. {
  1665. UtilMethods.StartCustomSplitTable(this,entityType);
  1666. var result = new SplitTableContext(this.Context)
  1667. {
  1668. EntityInfo = this.Context.EntityMaintenance.GetEntityInfo(entityType)
  1669. };
  1670. return result;
  1671. }
  1672. public SplitTableContextResult<T> SplitHelper<T>(T data) where T : class, new()
  1673. {
  1674. UtilMethods.StartCustomSplitTable(this, typeof(T));
  1675. var result = new SplitTableContext(this.Context)
  1676. {
  1677. EntityInfo = this.Context.EntityMaintenance.GetEntityInfo<T>()
  1678. };
  1679. return new SplitTableContextResult<T>()
  1680. {
  1681. Items = new List<T> { data },
  1682. Helper = result
  1683. };
  1684. }
  1685. public SplitTableContextResult<T> SplitHelper<T>(List<T> data) where T : class, new()
  1686. {
  1687. UtilMethods.StartCustomSplitTable(this, typeof(T));
  1688. var result = new SplitTableContext(this.Context)
  1689. {
  1690. EntityInfo = this.Context.EntityMaintenance.GetEntityInfo<T>()
  1691. };
  1692. return new SplitTableContextResult<T>()
  1693. {
  1694. Items = data,
  1695. Helper = result
  1696. };
  1697. }
  1698. #endregion
  1699. #region AsTenant
  1700. public ITenant AsTenant()
  1701. {
  1702. if (this.Root != null)
  1703. {
  1704. return this.Root;
  1705. }
  1706. else
  1707. {
  1708. Check.Exception(true, ErrorMessage.GetThrowMessage("Child objects do not support tenant methods, var childDb= Db.GetConnection(confid) ,Db is master ", "Db子对象不支持租户方法,请使用主对象,例如:var childDb= Db.GetConnection(confid) Db是主对象,childDb是子对象 "));
  1709. return null;
  1710. }
  1711. }
  1712. #endregion
  1713. #region Fastest
  1714. public IFastest<T> Fastest<T>() where T:class,new()
  1715. {
  1716. return new FastestProvider<T>(this);
  1717. }
  1718. #endregion
  1719. #region Other
  1720. public Task<SugarAsyncLock> AsyncLock(int timeOutSeconds = 30)
  1721. {
  1722. var result = new SugarAsyncLock(this);
  1723. return result.AsyncLock(timeOutSeconds);
  1724. }
  1725. public DynamicBuilder DynamicBuilder()
  1726. {
  1727. return new DynamicBuilder(this.Context);
  1728. }
  1729. public void Tracking<T>(T data) where T : class, new()
  1730. {
  1731. if (data != null)
  1732. {
  1733. UtilMethods.IsNullReturnNew(this.TempItems);
  1734. var key = "Tracking_" + data.GetHashCode() + "";
  1735. if (!this.TempItems.ContainsKey(key))
  1736. {
  1737. var newT = new T();
  1738. FastCopy.Copy(data, newT);
  1739. this.TempItems.Add(key, newT);
  1740. }
  1741. }
  1742. }
  1743. public void ClearTracking()
  1744. {
  1745. if (this.Context.TempItems != null)
  1746. {
  1747. var removeKeys = this.Context.TempItems.Where(it => it.Key.StartsWith("Tracking_") || it.Key.StartsWith("OldData_")).Select(it => it.Key).ToList();
  1748. foreach (string key in removeKeys)
  1749. {
  1750. this.Context.TempItems.Remove(key);
  1751. }
  1752. }
  1753. }
  1754. public void Tracking<T>(List<T> datas) where T : class, new()
  1755. {
  1756. foreach (var data in datas)
  1757. {
  1758. this.Tracking(data);
  1759. }
  1760. if (datas != null)
  1761. {
  1762. Check.ExceptionEasy(this.Context.TempItems.ContainsKey("OldData_" + datas.GetHashCode()), "The object already has a trace", "对象已存在跟踪,如果要在跟踪可以先清除 db.ClearTracking() ");
  1763. this.Context.TempItems.Add("OldData_" + datas.GetHashCode(), datas.Cast<T>().ToList());
  1764. }
  1765. }
  1766. public SqlSugarClient CopyNew()
  1767. {
  1768. var result= new SqlSugarClient(UtilMethods.CopyConfig(this.Ado.Context.CurrentConnectionConfig));
  1769. result.QueryFilter = this.QueryFilter;
  1770. return result;
  1771. }
  1772. public void ThenMapper<T>(IEnumerable<T> list, Action<T> action)
  1773. {
  1774. this.Context.Utilities.PageEach(list, 200, pageList =>
  1775. {
  1776. _ThenMapper(pageList, action);
  1777. });
  1778. }
  1779. public async Task ThenMapperAsync<T>(IEnumerable<T> list, Func<T, Task> action)
  1780. {
  1781. await this.Context.Utilities.PageEachAsync(list, 200,async pageList =>
  1782. {
  1783. await _ThenMapperAsync(pageList, action);
  1784. });
  1785. }
  1786. #endregion
  1787. }
  1788. }