QueryableProvider.cs 80 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Data;
  5. using System.Linq;
  6. using System.Linq.Expressions;
  7. using System.Text;
  8. using System.Text.RegularExpressions;
  9. using System.Reflection;
  10. using System.Dynamic;
  11. using System.Threading.Tasks;
  12. namespace SqlSugar
  13. {
  14. public partial class QueryableProvider<T> : QueryableAccessory, ISugarQueryable<T>
  15. {
  16. public ISugarQueryable<T> CrossQuery<Type>(string configId)
  17. {
  18. return this.CrossQuery(typeof(Type),configId);
  19. }
  20. public ISugarQueryable<T> CrossQuery(Type type, string configId)
  21. {
  22. if (this.QueryBuilder.CrossQueryItems == null)
  23. {
  24. this.QueryBuilder.CrossQueryItems = new Dictionary<string, string>();
  25. }
  26. if(!this.QueryBuilder.CrossQueryItems.ContainsKey(type.FullName))
  27. this.QueryBuilder.CrossQueryItems.Add(type.FullName, configId);
  28. return this;
  29. }
  30. public ISugarQueryable<T> IncludeLeftJoin(Expression<Func<T, object>> leftObjectExp)
  31. {
  32. MemberExpression memberExpression;
  33. string navObjectName;
  34. EntityColumnInfo navColumn, navPkColumn;
  35. EntityInfo navEntityInfo;
  36. ExpressionTool.GetOneToOneInfo(this.Context, leftObjectExp, out memberExpression, out navObjectName, out navColumn, out navEntityInfo, out navPkColumn);
  37. var shortName = $"pnv_{navObjectName}";
  38. var mainShortName = memberExpression.Expression.ToString();
  39. this.QueryBuilder.TableShortName = mainShortName;
  40. var onWhere = $"{SqlBuilder.GetTranslationColumnName(shortName)}.{SqlBuilder.GetTranslationColumnName(navPkColumn.DbColumnName)}={SqlBuilder.GetTranslationColumnName(mainShortName)}.{SqlBuilder.GetTranslationColumnName(navColumn.DbColumnName)}";
  41. UtilMethods.IsNullReturnNew(this.Context.TempItems);
  42. this.AddJoinInfo(GetTableName(navEntityInfo, navEntityInfo.DbTableName), shortName, onWhere, JoinType.Left);
  43. this.QueryBuilder.JoinQueryInfos.Last().EntityType = navEntityInfo.Type;
  44. return this;
  45. }
  46. public ISugarQueryable<T> IncludeInnerJoin(Expression<Func<T, object>> innerObjectExt)
  47. {
  48. MemberExpression memberExpression;
  49. string navObjectName;
  50. EntityColumnInfo navColumn, navPkColumn;
  51. EntityInfo navEntityInfo;
  52. ExpressionTool.GetOneToOneInfo(this.Context, innerObjectExt, out memberExpression, out navObjectName, out navColumn, out navEntityInfo, out navPkColumn);
  53. var shortName = $"pnv_{navObjectName}";
  54. var mainShortName = memberExpression.Expression.ToString();
  55. this.QueryBuilder.TableShortName = mainShortName;
  56. var onWhere = $"{SqlBuilder.GetTranslationColumnName(shortName)}.{SqlBuilder.GetTranslationColumnName(navPkColumn.DbColumnName)}={SqlBuilder.GetTranslationColumnName(mainShortName)}.{SqlBuilder.GetTranslationColumnName(navColumn.DbColumnName)}";
  57. UtilMethods.IsNullReturnNew(this.Context.TempItems);
  58. this.AddJoinInfo(GetTableName(navEntityInfo, navEntityInfo.DbTableName), shortName, onWhere, JoinType.Inner);
  59. this.QueryBuilder.JoinQueryInfos.Last().EntityType = navEntityInfo.Type;
  60. return this;
  61. }
  62. public ISugarQueryable<T> IncludeFullJoin(Expression<Func<T, object>> fullObjectExp)
  63. {
  64. MemberExpression memberExpression;
  65. string navObjectName;
  66. EntityColumnInfo navColumn, navPkColumn;
  67. EntityInfo navEntityInfo;
  68. ExpressionTool.GetOneToOneInfo(this.Context, fullObjectExp, out memberExpression, out navObjectName, out navColumn, out navEntityInfo, out navPkColumn);
  69. var shortName = $"pnv_{navObjectName}";
  70. var mainShortName = memberExpression.Expression.ToString();
  71. this.QueryBuilder.TableShortName = mainShortName;
  72. var onWhere = $"{SqlBuilder.GetTranslationColumnName(shortName)}.{SqlBuilder.GetTranslationColumnName(navPkColumn.DbColumnName)}={SqlBuilder.GetTranslationColumnName(mainShortName)}.{SqlBuilder.GetTranslationColumnName(navColumn.DbColumnName)}";
  73. UtilMethods.IsNullReturnNew(this.Context.TempItems);
  74. this.AddJoinInfo(GetTableName(navEntityInfo, navEntityInfo.DbTableName), shortName, onWhere, JoinType.Full);
  75. this.QueryBuilder.JoinQueryInfos.Last().EntityType = navEntityInfo.Type;
  76. return this;
  77. }
  78. public ISugarQueryable<T> IncludeRightJoin(Expression<Func<T, object>> rightObjectExp)
  79. {
  80. MemberExpression memberExpression;
  81. string navObjectName;
  82. EntityColumnInfo navColumn, navPkColumn;
  83. EntityInfo navEntityInfo;
  84. ExpressionTool.GetOneToOneInfo(this.Context, rightObjectExp, out memberExpression, out navObjectName, out navColumn, out navEntityInfo, out navPkColumn);
  85. var shortName = $"pnv_{navObjectName}";
  86. var mainShortName = memberExpression.Expression.ToString();
  87. this.QueryBuilder.TableShortName = mainShortName;
  88. var onWhere = $"{SqlBuilder.GetTranslationColumnName(shortName)}.{SqlBuilder.GetTranslationColumnName(navPkColumn.DbColumnName)}={SqlBuilder.GetTranslationColumnName(mainShortName)}.{SqlBuilder.GetTranslationColumnName(navColumn.DbColumnName)}";
  89. UtilMethods.IsNullReturnNew(this.Context.TempItems);
  90. this.AddJoinInfo(GetTableName(navEntityInfo, navEntityInfo.DbTableName), shortName, onWhere, JoinType.Right);
  91. this.QueryBuilder.JoinQueryInfos.Last().EntityType = navEntityInfo.Type;
  92. return this;
  93. }
  94. public ISugarQueryable<T, T2> LeftJoinIF<T2>(bool isJoin, ISugarQueryable<T2> joinQueryable, Expression<Func<T, T2, bool>> joinExpression)
  95. {
  96. var result = LeftJoin(joinQueryable, joinExpression);
  97. if (isJoin == false)
  98. {
  99. result.QueryBuilder.JoinQueryInfos.Remove(result.QueryBuilder.JoinQueryInfos.Last());
  100. }
  101. return result;
  102. }
  103. public ISugarQueryable<T, T2> InnerJoinIF<T2>(bool isJoin, ISugarQueryable<T2> joinQueryable, Expression<Func<T, T2, bool>> joinExpression)
  104. {
  105. var result = InnerJoin(joinQueryable, joinExpression);
  106. if (isJoin == false)
  107. {
  108. result.QueryBuilder.JoinQueryInfos.Remove(result.QueryBuilder.JoinQueryInfos.Last());
  109. }
  110. return result;
  111. }
  112. public ISugarQueryable<T, T2> LeftJoin<T2>(ISugarQueryable<T2> joinQueryable, Expression<Func<T, T2, bool>> joinExpression)
  113. {
  114. if (MasterHasWhereFirstJoin())
  115. {
  116. return this.MergeTable().LeftJoin<T2>(joinQueryable, joinExpression);
  117. }
  118. this.Context.InitMappingInfo<T2>();
  119. var result = InstanceFactory.GetQueryable<T, T2>(this.Context.CurrentConnectionConfig);
  120. result.SqlBuilder = this.SqlBuilder;
  121. result.Context = this.Context;
  122. var joinInfo = GetJoinInfo(joinExpression, JoinType.Left);
  123. var sqlObject = joinQueryable.ToSql();
  124. string sql = sqlObject.Key;
  125. this.QueryBuilder.LambdaExpressions.ParameterIndex += 100;
  126. UtilMethods.RepairReplicationParameters(ref sql, sqlObject.Value.ToArray(), this.QueryBuilder.LambdaExpressions.ParameterIndex, "");
  127. joinInfo.TableName = "(" + sql + ")";
  128. this.QueryBuilder.Parameters.AddRange(sqlObject.Value);
  129. result.QueryBuilder.JoinQueryInfos.Add(joinInfo);
  130. result.QueryBuilder.LambdaExpressions.ParameterIndex = this.QueryBuilder.LambdaExpressions.ParameterIndex;
  131. return result;
  132. }
  133. public ISugarQueryable<T, T2> InnerJoin<T2>(ISugarQueryable<T2> joinQueryable, Expression<Func<T, T2, bool>> joinExpression)
  134. {
  135. if (MasterHasWhereFirstJoin())
  136. {
  137. return this.MergeTable().InnerJoin<T2>(joinQueryable,joinExpression);
  138. }
  139. this.Context.InitMappingInfo<T2>();
  140. var result = InstanceFactory.GetQueryable<T, T2>(this.Context.CurrentConnectionConfig);
  141. result.SqlBuilder = this.SqlBuilder;
  142. result.Context = this.Context;
  143. var joinInfo = GetJoinInfo(joinExpression, JoinType.Inner);
  144. var sqlObject = joinQueryable.ToSql();
  145. string sql = sqlObject.Key;
  146. this.QueryBuilder.LambdaExpressions.ParameterIndex += 100;
  147. UtilMethods.RepairReplicationParameters(ref sql, sqlObject.Value.ToArray(), this.QueryBuilder.LambdaExpressions.ParameterIndex, "");
  148. joinInfo.TableName = "(" + sql + ")";
  149. this.QueryBuilder.Parameters.AddRange(sqlObject.Value);
  150. result.QueryBuilder.JoinQueryInfos.Add(joinInfo);
  151. result.QueryBuilder.LambdaExpressions.ParameterIndex = this.QueryBuilder.LambdaExpressions.ParameterIndex;
  152. return result;
  153. }
  154. public ISugarQueryable<T, T2> RightJoin<T2>(ISugarQueryable<T2> joinQueryable, Expression<Func<T, T2, bool>> joinExpression)
  155. {
  156. if (MasterHasWhereFirstJoin())
  157. {
  158. return this.MergeTable().RightJoin<T2>(joinQueryable, joinExpression);
  159. }
  160. this.Context.InitMappingInfo<T2>();
  161. var result = InstanceFactory.GetQueryable<T, T2>(this.Context.CurrentConnectionConfig);
  162. result.SqlBuilder = this.SqlBuilder;
  163. result.Context = this.Context;
  164. var joinInfo = GetJoinInfo(joinExpression, JoinType.Right);
  165. var sqlObject = joinQueryable.ToSql();
  166. string sql = sqlObject.Key;
  167. this.QueryBuilder.LambdaExpressions.ParameterIndex += 100;
  168. UtilMethods.RepairReplicationParameters(ref sql, sqlObject.Value.ToArray(), this.QueryBuilder.LambdaExpressions.ParameterIndex, "");
  169. joinInfo.TableName = "(" + sql + ")";
  170. this.QueryBuilder.Parameters.AddRange(sqlObject.Value);
  171. result.QueryBuilder.JoinQueryInfos.Add(joinInfo);
  172. result.QueryBuilder.LambdaExpressions.ParameterIndex = this.QueryBuilder.LambdaExpressions.ParameterIndex;
  173. return result;
  174. }
  175. public ISugarQueryable<T, T2> FullJoin<T2>(ISugarQueryable<T2> joinQueryable, Expression<Func<T, T2, bool>> joinExpression)
  176. {
  177. if (MasterHasWhereFirstJoin())
  178. {
  179. return this.MergeTable().FullJoin<T2>(joinQueryable,joinExpression);
  180. }
  181. this.Context.InitMappingInfo<T2>();
  182. var result = InstanceFactory.GetQueryable<T, T2>(this.Context.CurrentConnectionConfig);
  183. result.SqlBuilder = this.SqlBuilder;
  184. result.Context = this.Context;
  185. var joinInfo = GetJoinInfo(joinExpression, JoinType.Full);
  186. var sqlObject = joinQueryable.ToSql();
  187. string sql = sqlObject.Key;
  188. this.QueryBuilder.LambdaExpressions.ParameterIndex += 100;
  189. UtilMethods.RepairReplicationParameters(ref sql, sqlObject.Value.ToArray(), this.QueryBuilder.LambdaExpressions.ParameterIndex, "");
  190. joinInfo.TableName = "(" + sql + ")";
  191. this.QueryBuilder.Parameters.AddRange(sqlObject.Value);
  192. result.QueryBuilder.JoinQueryInfos.Add(joinInfo);
  193. result.QueryBuilder.LambdaExpressions.ParameterIndex = this.QueryBuilder.LambdaExpressions.ParameterIndex;
  194. return result;
  195. }
  196. public ISugarQueryable<T, T2> LeftJoin<T2>(Expression<Func<T, T2, bool>> joinExpression,string tableName)
  197. {
  198. var result= LeftJoin<T2>(joinExpression);
  199. result.QueryBuilder.JoinQueryInfos.Last().TableName = tableName;
  200. return result;
  201. }
  202. public ISugarQueryable<T, T2> LeftJoinIF<T2>(bool isLeftJoin, Expression<Func<T, T2, bool>> joinExpression)
  203. {
  204. var result = LeftJoin(joinExpression);
  205. if (isLeftJoin == false)
  206. {
  207. result.QueryBuilder.JoinQueryInfos.Remove(result.QueryBuilder.JoinQueryInfos.Last());
  208. }
  209. return result;
  210. }
  211. public ISugarQueryable<T, T2> InnerJoinIF<T2>(bool isJoin, Expression<Func<T, T2, bool>> joinExpression)
  212. {
  213. var result = InnerJoin(joinExpression);
  214. if (isJoin == false)
  215. {
  216. result.QueryBuilder.JoinQueryInfos.Remove(result.QueryBuilder.JoinQueryInfos.Last());
  217. }
  218. return result;
  219. }
  220. public ISugarQueryable<T, T2> LeftJoin<T2>(Expression<Func<T, T2, bool>> joinExpression)
  221. {
  222. if (MasterHasWhereFirstJoin())
  223. {
  224. return this.MergeTable().LeftJoin<T2>(joinExpression);
  225. }
  226. this.Context.InitMappingInfo<T2>();
  227. var result = InstanceFactory.GetQueryable<T, T2>(this.Context.CurrentConnectionConfig);
  228. result.SqlBuilder = this.SqlBuilder;
  229. result.Context = this.Context;
  230. this.QueryBuilder.IsSqlQuery = false;
  231. result.QueryBuilder.JoinQueryInfos.Add(GetJoinInfo(joinExpression,JoinType.Left));
  232. return result;
  233. }
  234. public ISugarQueryable<T, T2> FullJoin<T2>(Expression<Func<T, T2, bool>> joinExpression)
  235. {
  236. if (MasterHasWhereFirstJoin())
  237. {
  238. return this.MergeTable().FullJoin<T2>(joinExpression);
  239. }
  240. this.Context.InitMappingInfo<T2>();
  241. var result = InstanceFactory.GetQueryable<T, T2>(this.Context.CurrentConnectionConfig);
  242. result.SqlBuilder = this.SqlBuilder;
  243. result.Context = this.Context;
  244. result.QueryBuilder.JoinQueryInfos.Add(GetJoinInfo(joinExpression, JoinType.Full));
  245. return result;
  246. }
  247. public ISugarQueryable<T, T2> FullJoin<T2>(Expression<Func<T, T2, bool>> joinExpression, string tableName)
  248. {
  249. var result = FullJoin<T2>(joinExpression);
  250. result.QueryBuilder.JoinQueryInfos.Last().TableName = tableName;
  251. return result;
  252. }
  253. public ISugarQueryable<T, T2> RightJoin<T2>(Expression<Func<T, T2, bool>> joinExpression)
  254. {
  255. if (MasterHasWhereFirstJoin())
  256. {
  257. return this.MergeTable().RightJoin<T2>(joinExpression);
  258. }
  259. this.Context.InitMappingInfo<T2>();
  260. var result = InstanceFactory.GetQueryable<T, T2>(this.Context.CurrentConnectionConfig);
  261. result.SqlBuilder = this.SqlBuilder;
  262. result.Context = this.Context;
  263. result.QueryBuilder.JoinQueryInfos.Add(GetJoinInfo(joinExpression, JoinType.Right));
  264. return result;
  265. }
  266. public ISugarQueryable<T, T2> RightJoin<T2>(Expression<Func<T, T2, bool>> joinExpression, string tableName)
  267. {
  268. var result = RightJoin<T2>(joinExpression);
  269. result.QueryBuilder.JoinQueryInfos.Last().TableName = tableName;
  270. return result;
  271. }
  272. public ISugarQueryable<T, T2> InnerJoin<T2>(Expression<Func<T, T2, bool>> joinExpression)
  273. {
  274. if (MasterHasWhereFirstJoin())
  275. {
  276. return this.MergeTable().InnerJoin<T2>(joinExpression);
  277. }
  278. this.Context.InitMappingInfo<T2>();
  279. var result = InstanceFactory.GetQueryable<T, T2>(this.Context.CurrentConnectionConfig);
  280. result.SqlBuilder = this.SqlBuilder;
  281. result.Context = this.Context;
  282. result.QueryBuilder.JoinQueryInfos.Add(GetJoinInfo(joinExpression, JoinType.Inner));
  283. return result;
  284. }
  285. public ISugarQueryable<T, T2> InnerJoin<T2>(Expression<Func<T, T2, bool>> joinExpression, string tableName)
  286. {
  287. var result = InnerJoin<T2>(joinExpression);
  288. result.QueryBuilder.JoinQueryInfos.Last().TableName = tableName;
  289. return result;
  290. }
  291. public void Clear()
  292. {
  293. QueryBuilder.Clear();
  294. }
  295. public ISugarQueryable<T> IgnoreColumns(Expression<Func<T, object>> columns)
  296. {
  297. var ignoreColumns = QueryBuilder.GetExpressionValue(columns, ResolveExpressType.ArraySingle).GetResultArray().Select(it => this.SqlBuilder.GetNoTranslationColumnName(it).ToLower()).ToList();
  298. return IgnoreColumns(ignoreColumns.ToArray());
  299. }
  300. public ISugarQueryable<T> IgnoreColumns(params string[] columns)
  301. {
  302. if (QueryBuilder.IgnoreColumns.IsNullOrEmpty())
  303. {
  304. QueryBuilder.IgnoreColumns = new List<string>();
  305. }
  306. QueryBuilder.IgnoreColumns.AddRange(columns);
  307. return this;
  308. }
  309. public void AddQueue()
  310. {
  311. var sqlObj = this.ToSql();
  312. this.Context.Queues.Add(sqlObj.Key, sqlObj.Value);
  313. }
  314. public ISugarQueryable<T> Clone()
  315. {
  316. var queryable = this.Context.Queryable<object>().Select<T>().WithCacheIF(IsCache, CacheTime);
  317. CopyQueryBuilder(queryable.QueryBuilder);
  318. ((QueryableProvider<T>)queryable).CacheKey = this.CacheKey;
  319. ((QueryableProvider<T>)queryable).MapperAction = this.MapperAction;
  320. ((QueryableProvider<T>)queryable).MapperActionWithCache = this.MapperActionWithCache;
  321. ((QueryableProvider<T>)queryable).Mappers = this.Mappers;
  322. return queryable;
  323. }
  324. public ISugarQueryable<T> Hints(string hints)
  325. {
  326. this.QueryBuilder.Hints = hints;
  327. return this;
  328. }
  329. public virtual ISugarQueryable<T> AS<T2>(string tableName)
  330. {
  331. var entityName = typeof(T2).Name;
  332. return _As(tableName, entityName);
  333. }
  334. public ISugarQueryable<T> AS(string tableName)
  335. {
  336. if (tableName == null) return this;
  337. var entityName = typeof(T).Name;
  338. return _As(tableName, entityName);
  339. }
  340. public ISugarQueryable<T> AsWithAttr()
  341. {
  342. var asName=GetTableName(this.EntityInfo, this.EntityInfo.DbTableName);
  343. this.QueryBuilder.IsCrossQueryWithAttr = true;
  344. return this.AS(asName);
  345. }
  346. public ISugarQueryable<T> AsType(Type tableNameType)
  347. {
  348. return AS(this.Context.EntityMaintenance.GetEntityInfo(tableNameType).DbTableName);
  349. }
  350. public virtual ISugarQueryable<T> With(string withString)
  351. {
  352. if (this.Context.CurrentConnectionConfig.DbType == DbType.SqlServer)
  353. {
  354. QueryBuilder.TableWithString = withString;
  355. }
  356. return this;
  357. }
  358. public virtual ISugarQueryable<T> Filter(string FilterName, bool isDisabledGobalFilter = false)
  359. {
  360. _Filter(FilterName, isDisabledGobalFilter);
  361. return this;
  362. }
  363. public ISugarQueryable<T> ClearFilter()
  364. {
  365. this.Filter(null, true);
  366. return this;
  367. }
  368. public ISugarQueryable<T> ClearFilter(params Type[] types)
  369. {
  370. if (types == null|| types.Length==0)
  371. {
  372. return this;
  373. }
  374. this.QueryBuilder.RemoveFilters = types;
  375. this.Filter(null, true);
  376. this.QueryBuilder.IsDisabledGobalFilter = false;
  377. return this;
  378. }
  379. public ISugarQueryable<T> ClearFilter<FilterType1>()
  380. {
  381. this.ClearFilter(typeof(FilterType1));
  382. return this;
  383. }
  384. public ISugarQueryable<T> ClearFilter<FilterType1, FilterType2>()
  385. {
  386. this.ClearFilter(typeof(FilterType1),typeof(FilterType2));
  387. return this;
  388. }
  389. public ISugarQueryable<T> ClearFilter<FilterType1, FilterType2, FilterType3>()
  390. {
  391. this.ClearFilter(typeof(FilterType1), typeof(FilterType2),typeof(FilterType3));
  392. return this;
  393. }
  394. public ISugarQueryable<T> Filter(Type type)
  395. {
  396. if (type == null)
  397. {
  398. return this;
  399. }
  400. this.Context.InitMappingInfo(type);
  401. var whereString= QueryBuilder.GetFilters(type);
  402. if (whereString.HasValue())
  403. {
  404. this.Where(whereString);
  405. }
  406. UtilMethods.AddDiscrimator(type,this);
  407. return this;
  408. }
  409. public virtual ISugarQueryable<T> Mapper(Action<T> mapperAction)
  410. {
  411. this.MapperAction=UtilMethods.IsNullReturnNew(this.MapperAction);
  412. this.MapperAction.Add(mapperAction);
  413. return this;
  414. }
  415. public ISugarQueryable<T> Mapper<AType, BType, MappingType>(Expression<Func<MappingType, ManyToMany>> expression)
  416. {
  417. var args = ((expression as LambdaExpression).Body as MethodCallExpression).Arguments;
  418. Type aType = typeof(AType);
  419. Type bType = typeof(BType);
  420. Type bListType = typeof(List<BType>);
  421. this.Context.InitMappingInfo(aType);
  422. this.Context.InitMappingInfo(bType);
  423. this.Context.InitMappingInfo(typeof(MappingType));
  424. //Mapping
  425. var mappingEntity = this.Context.EntityMaintenance.GetEntityInfo(typeof(MappingType));
  426. string m_aPropertyName = (args[0] as MemberExpression).Member.Name;
  427. string m_bPropertyName= (args[1] as MemberExpression).Member.Name;
  428. var m_aDbField = mappingEntity.Columns.First(it => it.PropertyName == m_aPropertyName).DbColumnName;
  429. var m_bDbField = mappingEntity.Columns.First(it => it.PropertyName == m_bPropertyName).DbColumnName;
  430. //A
  431. var aEntity = this.Context.EntityMaintenance.GetEntityInfo(aType);
  432. var aPropertyName = aEntity.Columns.FirstOrDefault(it => it.IsPrimarykey == true)?.PropertyName;
  433. Check.Exception(aPropertyName == null, aEntity.EntityName + " no primary key");
  434. //B
  435. var bEntity = this.Context.EntityMaintenance.GetEntityInfo(bType);
  436. var bProperty = bEntity.Columns.FirstOrDefault(it => it.IsPrimarykey == true)?.PropertyName;
  437. Check.Exception(bProperty == null, bEntity.EntityName + " no primary key");
  438. var bDbFiled = bEntity.Columns.FirstOrDefault(it => it.IsPrimarykey == true).DbColumnName;
  439. this.Mapper((it,cache) =>
  440. {
  441. var list= cache.Get<Dictionary<object, List<BType>>>(oldList=> {
  442. //query mapping by a
  443. var cons = new List<IConditionalModel>() {
  444. new ConditionalModel(){
  445. ConditionalType=ConditionalType.In,
  446. FieldName= m_aDbField,
  447. FieldValue=string.Join(",",oldList.Select(z=>UtilMethods.GetPropertyValue(z,aPropertyName)).Distinct())
  448. }
  449. };
  450. var mappingList = this.Context.Queryable<MappingType>().Where(cons).ToList();
  451. var bids = mappingList.Select(z => UtilMethods.GetPropertyValue(z, m_bPropertyName)).Distinct().ToList();
  452. //queryable b by mapping
  453. cons = new List<IConditionalModel>() {
  454. new ConditionalModel(){
  455. ConditionalType=ConditionalType.In,
  456. FieldName= bDbFiled,
  457. FieldValue=string.Join(",",mappingList.Select(z=>UtilMethods.GetPropertyValue(z,m_bPropertyName)).Distinct())
  458. }
  459. };
  460. List<BType> bList = new List<BType>();
  461. if (mappingList.Any())
  462. {
  463. bList=this.Context.Queryable<BType>().Where(cons).ToList();
  464. }
  465. //get result
  466. Dictionary<object, List<BType>> result = new Dictionary<object, List<BType>>();
  467. var group = mappingList.GroupBy(z => UtilMethods.GetPropertyValue(z, m_aPropertyName));
  468. foreach (var item in group)
  469. {
  470. var currentBids = item.Select(z => UtilMethods.GetPropertyValue(z, m_bPropertyName)).ToList();
  471. result.Add(item.Key, bList.Where(z => currentBids.Contains(UtilMethods.GetPropertyValue(z, bProperty))).ToList());
  472. }
  473. return result;
  474. }, expression.ToString());
  475. foreach (var item in aEntity.Columns)
  476. {
  477. var aid = UtilMethods.GetPropertyValue(it, aPropertyName);
  478. if (list.ContainsKey(aid))
  479. {
  480. if (item.PropertyInfo.PropertyType == bType)
  481. {
  482. var b=UtilMethods.ChangeType<BType>(list[aid].FirstOrDefault());
  483. item.PropertyInfo.SetValue(it, b);
  484. }
  485. else if (item.PropertyInfo.PropertyType == bListType)
  486. {
  487. var bList = UtilMethods.ChangeType<List<BType>>(list[aid]);
  488. item.PropertyInfo.SetValue(it, bList);
  489. }
  490. }
  491. }
  492. });
  493. return this;
  494. }
  495. public virtual ISugarQueryable<T> Mapper(Action<T, MapperCache<T>> mapperAction)
  496. {
  497. this.MapperActionWithCache += mapperAction;
  498. return this;
  499. }
  500. public ISugarQueryable<T> Mapper<TObject>(Expression<Func<T, TObject>> mapperObject, Expression<Func<T, object>> mainField, Expression<Func<T, object>> childField)
  501. {
  502. Check.Exception(mapperObject.ReturnType.Name == "IList`1", "Mapper no support IList , Use List<T>");
  503. if (CallContext.MapperExpression.Value == null)
  504. {
  505. CallContext.MapperExpression.Value = new List<MapperExpression>();
  506. }
  507. CallContext.MapperExpression.Value.Add(new MapperExpression() { SqlBuilder = SqlBuilder, QueryBuilder = this.QueryBuilder, Type = MapperExpressionType.oneToOne, FillExpression = mapperObject, MappingField1Expression = mainField, MappingField2Expression = childField, Context = this.Context });
  508. return _Mapper<TObject>(mapperObject, mainField, childField);
  509. }
  510. public ISugarQueryable<T> Mapper<TObject>(Expression<Func<T, List<TObject>>> mapperObject, Expression<Func<T, object>> mainField, Expression<Func<T, object>> childField)
  511. {
  512. return _Mapper<TObject>(mapperObject, mainField, childField);
  513. }
  514. public virtual ISugarQueryable<T> Mapper<TObject>(Expression<Func<T, List<TObject>>> mapperObject, Expression<Func<T, object>> mapperField)
  515. {
  516. Check.Exception(mapperObject.ReturnType.Name == "IList`1", "Mapper no support IList , Use List<T>");
  517. if (CallContext.MapperExpression.Value == null)
  518. {
  519. CallContext.MapperExpression.Value = new List<MapperExpression>();
  520. }
  521. CallContext.MapperExpression.Value.Add(new MapperExpression() { SqlBuilder = SqlBuilder, QueryBuilder = this.QueryBuilder, Type = MapperExpressionType.oneToN, FillExpression = mapperObject, MappingField1Expression = mapperField, Context = this.Context });
  522. return _Mapper<TObject>(mapperObject, mapperField);
  523. }
  524. public virtual ISugarQueryable<T> Mapper<TObject>(Expression<Func<T, TObject>> mapperObject, Expression<Func<T, object>> mapperField)
  525. {
  526. if (CallContext.MapperExpression.Value == null)
  527. {
  528. CallContext.MapperExpression.Value = new List<MapperExpression>();
  529. }
  530. CallContext.MapperExpression.Value.Add(new MapperExpression() { SqlBuilder = SqlBuilder, QueryBuilder = this.QueryBuilder, Type = MapperExpressionType.oneToOne, FillExpression = mapperObject, MappingField1Expression = mapperField, Context = this.Context });
  531. return _Mapper<TObject>(mapperObject, mapperField);
  532. }
  533. public ISugarQueryable<T> Where(string fieldName, string conditionalType, object fieldValue)
  534. {
  535. string parameterName = fieldName.Replace(".","_")+ this.QueryBuilder.WhereIndex;
  536. var whereSql = this.SqlBuilder.GetWhere(fieldName, conditionalType, this.QueryBuilder.WhereIndex);
  537. this.Where(whereSql);
  538. this.QueryBuilder.WhereIndex++;
  539. this.QueryBuilder.Parameters.Add(new SugarParameter(parameterName, fieldValue));
  540. return this;
  541. }
  542. public virtual ISugarQueryable<T> AddParameters(object parameters)
  543. {
  544. if (parameters != null)
  545. QueryBuilder.Parameters.AddRange(Context.Ado.GetParameters(parameters));
  546. return this;
  547. }
  548. public virtual ISugarQueryable<T> AddParameters(SugarParameter[] parameters)
  549. {
  550. if (parameters != null)
  551. QueryBuilder.Parameters.AddRange(parameters);
  552. return this;
  553. }
  554. public virtual ISugarQueryable<T> AddParameters(List<SugarParameter> parameters)
  555. {
  556. if (parameters != null)
  557. QueryBuilder.Parameters.AddRange(parameters);
  558. return this;
  559. }
  560. public virtual ISugarQueryable<T> AddParameters(SugarParameter parameter)
  561. {
  562. if (parameter != null)
  563. QueryBuilder.Parameters.Add(parameter);
  564. return this;
  565. }
  566. public ISugarQueryable<T> AddJoinInfo(Type JoinType, Dictionary<string, Type> keyIsShortName_ValueIsType_Dictionary, FormattableString onExpString, JoinType type = JoinType.Left)
  567. {
  568. var whereExp = DynamicCoreHelper.GetWhere(keyIsShortName_ValueIsType_Dictionary,onExpString);
  569. var name=whereExp.Parameters.Last(it => it.Type == JoinType).Name;
  570. var sql = this.QueryBuilder.GetExpressionValue(whereExp, ResolveExpressType.WhereMultiple).GetResultString();
  571. return AddJoinInfo(JoinType, name, sql,type);
  572. }
  573. public ISugarQueryable<T> AddJoinInfo(Type JoinType, string shortName, string joinWhere, JoinType type = JoinType.Left)
  574. {
  575. this.Context.InitMappingInfo(JoinType);
  576. var tableName = this.Context.EntityMaintenance.GetEntityInfo(JoinType).DbTableName;
  577. QueryBuilder.JoinIndex = +1;
  578. QueryBuilder.JoinQueryInfos
  579. .Add(new JoinQueryInfo()
  580. {
  581. JoinIndex = QueryBuilder.JoinIndex,
  582. TableName = tableName,
  583. ShortName = shortName,
  584. JoinType = type,
  585. JoinWhere = joinWhere,
  586. EntityType=JoinType
  587. });
  588. return this;
  589. }
  590. public virtual ISugarQueryable<T> AddJoinInfo(string tableName, string shortName, string joinWhere, JoinType type = JoinType.Left)
  591. {
  592. QueryBuilder.JoinIndex = +1;
  593. QueryBuilder.JoinQueryInfos
  594. .Add(new JoinQueryInfo()
  595. {
  596. JoinIndex = QueryBuilder.JoinIndex,
  597. TableName = tableName,
  598. ShortName = shortName,
  599. JoinType = type,
  600. JoinWhere = joinWhere
  601. });
  602. return this;
  603. }
  604. /// <summary>
  605. /// if a property that is not empty is a condition
  606. /// </summary>
  607. /// <param name="whereClass"></param>
  608. /// <returns></returns>
  609. public ISugarQueryable<T> WhereClass<ClassType>(ClassType whereClass, bool ignoreDefaultValue = false) where ClassType : class, new()
  610. {
  611. return WhereClass(new List<ClassType>() { whereClass }, ignoreDefaultValue);
  612. }
  613. public ISugarQueryable<T> WhereClassByPrimaryKey(List<T> list)
  614. {
  615. _WhereClassByPrimaryKey(list);
  616. return this;
  617. }
  618. public ISugarQueryable<T> WhereClassByWhereColumns(List<T> list, string[] whereColumns)
  619. {
  620. _WhereClassByWhereColumns(list,whereColumns);
  621. return this;
  622. }
  623. public ISugarQueryable<T> WhereClassByPrimaryKey(T data)
  624. {
  625. _WhereClassByPrimaryKey(new List<T>() { data });
  626. return this;
  627. }
  628. public ISugarQueryable<T> TranLock(DbLockType? LockType = DbLockType.Wait)
  629. {
  630. if (LockType == null) return this;
  631. Check.ExceptionEasy(this.Context.Ado.Transaction == null, "need BeginTran", "需要事务才能使用TranLock");
  632. Check.ExceptionEasy(this.QueryBuilder.IsSingle()==false, "TranLock, can only be used for single table query", "TranLock只能用在单表查询");
  633. if (this.Context.CurrentConnectionConfig.DbType == DbType.SqlServer)
  634. {
  635. if (LockType == DbLockType.Wait)
  636. {
  637. this.With("WITH(UpdLock,RowLock)");
  638. }
  639. else
  640. {
  641. this.With("WITH(UpdLock,RowLock,NoWait)");
  642. }
  643. }
  644. else
  645. {
  646. this.QueryBuilder.TranLock = (LockType == DbLockType.Error? " for update nowait" : " for update");
  647. }
  648. return this;
  649. }
  650. public ISugarQueryable<T> WhereColumns(Dictionary<string, object> dictionary)
  651. {
  652. return WhereColumns(new List<Dictionary<string, object>> { dictionary });
  653. }
  654. public ISugarQueryable<T> WhereColumns(Dictionary<string, object> columns, bool ignoreDefaultValue)
  655. {
  656. if (ignoreDefaultValue == false || columns == null)
  657. {
  658. return WhereColumns(columns);
  659. }
  660. else
  661. {
  662. var newColumns = new Dictionary<string, object>();
  663. foreach (var item in columns)
  664. {
  665. if (!UtilMethods.IsDefaultValue(item.Value))
  666. {
  667. newColumns.Add(item.Key, item.Value);
  668. }
  669. }
  670. return WhereColumns(newColumns);
  671. }
  672. }
  673. public ISugarQueryable<T> WhereColumns(List<Dictionary<string, object>> list)
  674. {
  675. List<IConditionalModel> conditionalModels = new List<IConditionalModel>();
  676. foreach (var model in list)
  677. {
  678. int i = 0;
  679. var clist = new List<KeyValuePair<WhereType, ConditionalModel>>();
  680. foreach (var item in model.Keys)
  681. {
  682. var value = model[item] == null ? "null" : model[item].ObjToString();
  683. var csType = model[item] == null ? null : model[item].GetType().Name;
  684. if (model[item] is Enum&&this.Context?.CurrentConnectionConfig?.MoreSettings?.TableEnumIsString!=true)
  685. {
  686. value = Convert.ToInt64(model[item])+"";
  687. csType = "Int64";
  688. }
  689. clist.Add(new KeyValuePair<WhereType, ConditionalModel>(i == 0 ? WhereType.Or : WhereType.And, new ConditionalModel()
  690. {
  691. FieldName = item,
  692. ConditionalType = ConditionalType.Equal,
  693. FieldValue = value,
  694. CSharpTypeName = csType
  695. }));
  696. i++;
  697. }
  698. conditionalModels.Add(new ConditionalCollections()
  699. {
  700. ConditionalList = clist
  701. });
  702. }
  703. return this.Where(conditionalModels);
  704. }
  705. /// <summary>
  706. /// if a property that is primary key is a condition
  707. /// </summary>
  708. /// <param name="whereClassTypes"></param>
  709. /// <returns></returns>
  710. public ISugarQueryable<T> _WhereClassByPrimaryKey(List<T> whereClassTypes)
  711. {
  712. if (whereClassTypes.HasValue())
  713. {
  714. var columns = this.Context.EntityMaintenance.GetEntityInfo<T>().Columns.Where(it => it.IsIgnore == false && it.IsPrimarykey == true).ToList();
  715. Check.Exception(columns == null || columns.Count == 0, "{0} no primary key, Can not use WhereClassByPrimaryKey ", typeof(T).Name);
  716. Check.Exception(this.QueryBuilder.IsSingle() == false, "No support join query");
  717. List<IConditionalModel> whereModels = new List<IConditionalModel>();
  718. foreach (var item in whereClassTypes)
  719. {
  720. var cons = new ConditionalCollections();
  721. foreach (var column in columns)
  722. {
  723. WhereType WhereType = WhereType.And;
  724. var value = column.PropertyInfo.GetValue(item, null);
  725. if (cons.ConditionalList == null)
  726. {
  727. cons.ConditionalList = new List<KeyValuePair<WhereType, ConditionalModel>>();
  728. if (QueryBuilder.WhereInfos.IsNullOrEmpty() && whereModels.IsNullOrEmpty())
  729. {
  730. }
  731. else
  732. {
  733. WhereType = WhereType.Or;
  734. }
  735. }
  736. var data = new KeyValuePair<WhereType, ConditionalModel>(WhereType, new ConditionalModel()
  737. {
  738. ConditionalType = ConditionalType.Equal,
  739. FieldName = this.QueryBuilder.Builder.GetTranslationColumnName(column.DbColumnName),
  740. FieldValue = value.ObjToStringNew(),
  741. CSharpTypeName = column.UnderType.Name
  742. });
  743. if (value is Enum && this.Context.CurrentConnectionConfig?.MoreSettings?.TableEnumIsString != true)
  744. {
  745. data.Value.FieldValue = Convert.ToInt64(value).ObjToString();
  746. data.Value.CSharpTypeName = "int";
  747. }
  748. else if (value != null&&column.UnderType==UtilConstants.DateType)
  749. {
  750. data.Value.FieldValue = Convert.ToDateTime(value).ToString("yyyy-MM-dd HH:mm:ss.fff");
  751. }
  752. //if (this.Context.CurrentConnectionConfig.DbType == DbType.PostgreSQL)
  753. //{
  754. // data.Value.FieldValueConvertFunc = it =>
  755. // {
  756. // return UtilMethods.ChangeType2(it, value.GetType());
  757. // };
  758. //}
  759. cons.ConditionalList.Add(data);
  760. }
  761. if (cons.HasValue())
  762. {
  763. whereModels.Add(cons);
  764. }
  765. }
  766. this.Where(whereModels,true);
  767. }
  768. else
  769. {
  770. this.Where(" 1=2 ");
  771. }
  772. return this;
  773. }
  774. /// <summary>
  775. /// if a property that is whereColumns key is a condition
  776. /// </summary>
  777. /// <param name="whereClassTypes"></param>
  778. /// <returns></returns>
  779. public ISugarQueryable<T> _WhereClassByWhereColumns(List<T> whereClassTypes,string[] whereColumns)
  780. {
  781. if (whereClassTypes.HasValue())
  782. {
  783. var columns = this.Context.EntityMaintenance.GetEntityInfo<T>().Columns.Where(it => whereColumns.Any(x=>x==it.PropertyName)|| whereColumns.Any(x => x.EqualCase(it.DbColumnName))).ToList();
  784. Check.Exception(columns == null || columns.Count == 0, "{0} no primary key, Can not use whereColumns ", typeof(T).Name);
  785. Check.Exception(this.QueryBuilder.IsSingle() == false, "No support join query");
  786. List<IConditionalModel> whereModels = new List<IConditionalModel>();
  787. foreach (var item in whereClassTypes)
  788. {
  789. var cons = new ConditionalCollections();
  790. foreach (var column in columns)
  791. {
  792. WhereType WhereType = WhereType.And;
  793. var value = column.PropertyInfo.GetValue(item, null);
  794. if (cons.ConditionalList == null)
  795. {
  796. cons.ConditionalList = new List<KeyValuePair<WhereType, ConditionalModel>>();
  797. if (QueryBuilder.WhereInfos.IsNullOrEmpty() && whereModels.IsNullOrEmpty())
  798. {
  799. }
  800. else
  801. {
  802. WhereType = WhereType.Or;
  803. }
  804. }
  805. var disableQueryWhereColumnRemoveTrim = this.Context.CurrentConnectionConfig?.MoreSettings?.DisableQueryWhereColumnRemoveTrim == true;
  806. var data = new KeyValuePair<WhereType, ConditionalModel>(WhereType, new ConditionalModel()
  807. {
  808. ConditionalType = ConditionalType.Equal,
  809. FieldName = this.QueryBuilder.Builder.GetTranslationColumnName(column.DbColumnName),
  810. FieldValue = disableQueryWhereColumnRemoveTrim?value.ObjToStringNoTrim() : value.ObjToStringNew(),
  811. CSharpTypeName = column.PropertyInfo.PropertyType.Name
  812. });
  813. if (value is Enum && this.Context.CurrentConnectionConfig?.MoreSettings?.TableEnumIsString != true)
  814. {
  815. data.Value.FieldValue = Convert.ToInt64(value).ObjToString();
  816. data.Value.CSharpTypeName = "int";
  817. }
  818. //if (this.Context.CurrentConnectionConfig.DbType == DbType.PostgreSQL)
  819. //{
  820. // data.Value.FieldValueConvertFunc = it =>
  821. // {
  822. // return UtilMethods.ChangeType2(it, value.GetType());
  823. // };
  824. //}
  825. cons.ConditionalList.Add(data);
  826. }
  827. if (cons.HasValue())
  828. {
  829. whereModels.Add(cons);
  830. }
  831. }
  832. this.Where(whereModels, true);
  833. }
  834. else
  835. {
  836. this.Where(" 1=2 ");
  837. }
  838. return this;
  839. }
  840. /// <summary>
  841. /// if a property that is not empty is a condition
  842. /// </summary>
  843. /// <param name="whereClassTypes"></param>
  844. /// <returns></returns>
  845. public ISugarQueryable<T> WhereClass<ClassType>(List<ClassType> whereClassTypes, bool ignoreDefaultValue = false) where ClassType : class, new()
  846. {
  847. if (whereClassTypes.HasValue())
  848. {
  849. var columns = this.Context.EntityMaintenance.GetEntityInfo<ClassType>().Columns.Where(it => it.IsIgnore == false).ToList();
  850. List<IConditionalModel> whereModels = new List<IConditionalModel>();
  851. foreach (var item in whereClassTypes)
  852. {
  853. var cons = new ConditionalCollections();
  854. foreach (var column in columns)
  855. {
  856. var value = column.PropertyInfo.GetValue(item, null);
  857. WhereType WhereType = WhereType.And;
  858. var isNotNull = ignoreDefaultValue == false && value != null;
  859. var isNotNullAndDefault = ignoreDefaultValue && value != null && value.ObjToString() != UtilMethods.DefaultForType(column.PropertyInfo.PropertyType).ObjToString();
  860. if (isNotNull || isNotNullAndDefault)
  861. {
  862. if (cons.ConditionalList == null)
  863. {
  864. cons.ConditionalList = new List<KeyValuePair<WhereType, ConditionalModel>>();
  865. if (QueryBuilder.WhereInfos.IsNullOrEmpty() && whereModels.IsNullOrEmpty())
  866. {
  867. }
  868. else
  869. {
  870. WhereType = WhereType.Or;
  871. }
  872. }
  873. var data = new KeyValuePair<WhereType, ConditionalModel>(WhereType, new ConditionalModel()
  874. {
  875. ConditionalType = ConditionalType.Equal,
  876. FieldName = column.DbColumnName,
  877. FieldValue = value.ObjToString(),
  878. CSharpTypeName=column.UnderType.Name
  879. });
  880. if (value != null && value.GetType().IsEnum())
  881. {
  882. if (this.Context.CurrentConnectionConfig?.MoreSettings?.TableEnumIsString == true)
  883. {
  884. }
  885. else
  886. {
  887. data.Value.FieldValue = Convert.ToInt64(value).ObjToString();
  888. }
  889. }
  890. else if (value != null && column.PropertyInfo.PropertyType == UtilConstants.DateType)
  891. {
  892. data.Value.FieldValue = value.ObjToDate().ToString("yyyy-MM-dd HH:mm:ss.ffffff");
  893. }
  894. cons.ConditionalList.Add(data);
  895. if (this.Context.CurrentConnectionConfig.DbType == DbType.PostgreSQL)
  896. {
  897. data.Value.FieldValueConvertFunc = it =>
  898. {
  899. return UtilMethods.ChangeType2(it, value.GetType());
  900. };
  901. }
  902. }
  903. }
  904. if (cons.HasValue())
  905. {
  906. whereModels.Add(cons);
  907. }
  908. }
  909. this.Where(whereModels);
  910. }
  911. return this;
  912. }
  913. public ISugarQueryable<T> Where(Dictionary<string, Type> keyIsShortName_ValueIsType_Dictionary, FormattableString expressionString)
  914. {
  915. var exp = DynamicCoreHelper.GetWhere(keyIsShortName_ValueIsType_Dictionary, expressionString);
  916. _Where(exp);
  917. return this;
  918. }
  919. public virtual ISugarQueryable<T> Where(string expShortName, FormattableString expressionString)
  920. {
  921. if (expressionString == null&& !Regex.IsMatch(expShortName,@"^\w$"))
  922. {
  923. return this.Where(expShortName, new { });
  924. }
  925. var exp = DynamicCoreHelper.GetWhere<T>(expShortName, expressionString);
  926. _Where(exp);
  927. return this;
  928. }
  929. public virtual ISugarQueryable<T> Where(Expression<Func<T, bool>> expression)
  930. {
  931. if (IsSingleWithChildTableQuery())
  932. {
  933. expression = ReplaceMasterTableParameters(expression);
  934. }
  935. this._Where(expression);
  936. return this;
  937. }
  938. public virtual ISugarQueryable<T> Where(string whereString, object whereObj = null)
  939. {
  940. if (whereString.HasValue())
  941. this.Where<T>(whereString, whereObj);
  942. return this;
  943. }
  944. public virtual ISugarQueryable<T> Where(IFuncModel funcModel)
  945. {
  946. var obj= this.SqlBuilder.FuncModelToSql(funcModel);
  947. return this.Where(obj.Key, obj.Value);
  948. }
  949. public virtual ISugarQueryable<T> Where(List<IConditionalModel> conditionalModels)
  950. {
  951. if (conditionalModels.IsNullOrEmpty()) return this;
  952. var sqlObj = this.SqlBuilder.ConditionalModelToSql(conditionalModels,0);
  953. if (sqlObj.Value != null && this.QueryBuilder.Parameters != null)
  954. {
  955. if (sqlObj.Value.Any(it => this.QueryBuilder.Parameters.Any(z => z.ParameterName.EqualCase(it.ParameterName))))
  956. {
  957. var sql = sqlObj.Key;
  958. this.SqlBuilder.RepairReplicationParameters(ref sql,sqlObj.Value,this.QueryBuilder.Parameters.Count*10);
  959. return this.Where(sql, sqlObj.Value);
  960. }
  961. }
  962. return this.Where(sqlObj.Key, sqlObj.Value);
  963. }
  964. public ISugarQueryable<T> Where(List<IConditionalModel> conditionalModels, bool isWrap)
  965. {
  966. if (conditionalModels.IsNullOrEmpty()) return this;
  967. var sqlObj = this.SqlBuilder.ConditionalModelToSql(conditionalModels, 0);
  968. if (isWrap)
  969. {
  970. return this.Where("("+sqlObj.Key+")", sqlObj.Value);
  971. }
  972. else
  973. {
  974. return this.Where(sqlObj.Key, sqlObj.Value);
  975. }
  976. }
  977. public virtual ISugarQueryable<T> Where<T2>(string whereString, object whereObj = null)
  978. {
  979. var whereValue = QueryBuilder.WhereInfos;
  980. whereValue.Add(SqlBuilder.AppendWhereOrAnd(whereValue.Count == 0, whereString + UtilConstants.Space));
  981. if (whereObj != null)
  982. QueryBuilder.Parameters.AddRange(Context.Ado.GetParameters(whereObj));
  983. return this;
  984. }
  985. public virtual ISugarQueryable<T> Having(Expression<Func<T, bool>> expression)
  986. {
  987. this._Having(expression);
  988. return this;
  989. }
  990. public virtual ISugarQueryable<T> HavingIF(bool isHaving,Expression<Func<T, bool>> expression)
  991. {
  992. if(isHaving)
  993. this._Having(expression);
  994. return this;
  995. }
  996. public virtual ISugarQueryable<T> Having(string whereString, object parameters = null)
  997. {
  998. QueryBuilder.HavingInfos = SqlBuilder.AppendHaving(whereString);
  999. if (parameters != null)
  1000. QueryBuilder.Parameters.AddRange(Context.Ado.GetParameters(parameters));
  1001. return this;
  1002. }
  1003. public virtual ISugarQueryable<T> WhereIF(bool isWhere, Expression<Func<T, bool>> expression)
  1004. {
  1005. if (!isWhere) return this;
  1006. if (IsSingleWithChildTableQuery())
  1007. {
  1008. expression = ReplaceMasterTableParameters(expression);
  1009. }
  1010. _Where(expression);
  1011. return this;
  1012. }
  1013. public virtual ISugarQueryable<T> WhereIF(bool isWhere, string whereString, object whereObj = null)
  1014. {
  1015. if (!isWhere) return this;
  1016. this.Where<T>(whereString, whereObj);
  1017. return this;
  1018. }
  1019. public virtual T InSingle(object pkValue)
  1020. {
  1021. if (pkValue == null)
  1022. {
  1023. pkValue = -1;
  1024. }
  1025. Check.Exception(this.QueryBuilder.SelectValue.HasValue(), "'InSingle' and' Select' can't be used together,You can use .Select(it=>...).Single(it.id==1)");
  1026. var list = In(pkValue).ToList();
  1027. if (list == null) return default(T);
  1028. else return list.SingleOrDefault();
  1029. }
  1030. public ISugarQueryable<T> InIF<TParamter>(bool isIn,string fieldName, params TParamter[] pkValues)
  1031. {
  1032. if (isIn)
  1033. {
  1034. return In(fieldName, pkValues);
  1035. }
  1036. else
  1037. {
  1038. return this;
  1039. }
  1040. }
  1041. public ISugarQueryable<T> InIF<TParamter>(bool isIn, params TParamter[] pkValues)
  1042. {
  1043. if (isIn)
  1044. {
  1045. In(pkValues);
  1046. }
  1047. return this;
  1048. }
  1049. public virtual ISugarQueryable<T> In<TParamter>(params TParamter[] pkValues)
  1050. {
  1051. if (pkValues == null || pkValues.Length == 0)
  1052. {
  1053. Where(SqlBuilder.SqlFalse);
  1054. return this;
  1055. }
  1056. if (pkValues.Length == 1 && pkValues.First().GetType().FullName.IsCollectionsList() || (pkValues.First() is IEnumerable && pkValues.First().GetType() != UtilConstants.StringType))
  1057. {
  1058. var newValues = new List<object>();
  1059. foreach (var item in pkValues.First() as IEnumerable)
  1060. {
  1061. newValues.Add(item);
  1062. }
  1063. return In(newValues);
  1064. }
  1065. var pks = GetPrimaryKeys().Select(it => SqlBuilder.GetTranslationTableName(it)).ToList();
  1066. Check.Exception(pks == null || pks.Count != 1, "Queryable.In(params object[] pkValues): Only one primary key");
  1067. string filed = pks.FirstOrDefault();
  1068. string shortName = QueryBuilder.TableShortName == null ? null : (QueryBuilder.TableShortName + ".");
  1069. filed = shortName + filed;
  1070. return In(filed, pkValues);
  1071. }
  1072. public virtual ISugarQueryable<T> In<FieldType>(string filed, params FieldType[] inValues)
  1073. {
  1074. if (inValues.Length == 1)
  1075. {
  1076. if (inValues.GetType().IsArray)
  1077. {
  1078. var whereIndex = QueryBuilder.WhereIndex;
  1079. string parameterName = this.SqlBuilder.SqlParameterKeyWord + "InPara" + whereIndex;
  1080. this.AddParameters(new SugarParameter(parameterName, inValues[0]));
  1081. this.Where(string.Format(QueryBuilder.EqualTemplate,SqlBuilder.GetTranslationColumnName(filed), parameterName));
  1082. QueryBuilder.WhereIndex++;
  1083. }
  1084. else
  1085. {
  1086. var values = new List<object>();
  1087. foreach (var item in ((IEnumerable)inValues[0]))
  1088. {
  1089. if (item != null)
  1090. {
  1091. values.Add(item.ToString().ToSqlValue());
  1092. }
  1093. }
  1094. this.Where(string.Format(QueryBuilder.InTemplate, SqlBuilder.GetTranslationColumnName(filed), string.Join(",", values)));
  1095. }
  1096. }
  1097. else
  1098. {
  1099. var values = new List<object>();
  1100. foreach (var item in inValues)
  1101. {
  1102. if (item != null)
  1103. {
  1104. if (UtilMethods.IsNumber(item.GetType().Name))
  1105. {
  1106. values.Add(item.ToString());
  1107. }
  1108. else
  1109. {
  1110. values.Add(item.ToString().ToSqlValue());
  1111. }
  1112. }
  1113. }
  1114. this.Where(string.Format(QueryBuilder.InTemplate, SqlBuilder.GetTranslationColumnName(filed), string.Join(",", values)));
  1115. }
  1116. return this;
  1117. }
  1118. public virtual ISugarQueryable<T> In<FieldType>(Expression<Func<T, object>> expression, params FieldType[] inValues)
  1119. {
  1120. QueryBuilder.CheckExpression(expression, "In");
  1121. var isSingle = QueryBuilder.IsSingle();
  1122. var lamResult = QueryBuilder.GetExpressionValue(expression, isSingle ? ResolveExpressType.FieldSingle : ResolveExpressType.FieldMultiple);
  1123. var fieldName = lamResult.GetResultString();
  1124. var propertyName = ExpressionTool.GetMemberName(expression);
  1125. var propertyColumn = this.EntityInfo.Columns.FirstOrDefault(it => it.PropertyName == propertyName);
  1126. if (inValues?.Length==1&& inValues[0]?.GetType()?.FullName?.IsCollectionsList()==true && propertyColumn != null && propertyColumn?.UnderType?.FullName?.IsCollectionsList()!=true)
  1127. {
  1128. return In(fieldName, UtilMethods.ConvertToListOfObjects(inValues[0]));
  1129. }
  1130. else if (inValues?.Length == 1 && inValues[0]?.GetType()?.IsArray == true && propertyColumn != null && propertyColumn?.UnderType?.IsArray != true)
  1131. {
  1132. return In(fieldName, UtilMethods.ConvertToListOfObjects(inValues[0]));
  1133. }
  1134. else
  1135. {
  1136. return In(fieldName, inValues);
  1137. }
  1138. }
  1139. public virtual ISugarQueryable<T> In<TParamter>(List<TParamter> pkValues)
  1140. {
  1141. if (pkValues == null || pkValues.Count == 0)
  1142. {
  1143. Where(SqlBuilder.SqlFalse);
  1144. return this;
  1145. }
  1146. return In(pkValues.ToArray());
  1147. }
  1148. public virtual ISugarQueryable<T> In<FieldType>(string InFieldName, List<FieldType> inValues)
  1149. {
  1150. if (inValues == null || inValues.Count == 0)
  1151. {
  1152. Where(SqlBuilder.SqlFalse);
  1153. return this;
  1154. }
  1155. return In(InFieldName, inValues.ToArray());
  1156. }
  1157. public virtual ISugarQueryable<T> In<FieldType>(Expression<Func<T, object>> expression, List<FieldType> inValues)
  1158. {
  1159. if (inValues == null || inValues.Count == 0)
  1160. {
  1161. Where(SqlBuilder.SqlFalse);
  1162. return this;
  1163. }
  1164. return In(expression, inValues.ToArray());
  1165. }
  1166. public ISugarQueryable<T> InIF<FieldType>(bool isWhere,Expression<Func<T, object>> expression, ISugarQueryable<FieldType> childQueryExpression)
  1167. {
  1168. if (isWhere)
  1169. {
  1170. var sqlObj = childQueryExpression.ToSql();
  1171. _InQueryable(expression, sqlObj);
  1172. }
  1173. return this;
  1174. }
  1175. public virtual ISugarQueryable<T> In<FieldType>(Expression<Func<T, object>> expression, ISugarQueryable<FieldType> childQueryExpression)
  1176. {
  1177. var sqlObj = childQueryExpression.ToSql();
  1178. _InQueryable(expression, sqlObj);
  1179. return this;
  1180. }
  1181. public ISugarQueryable<T> SampleBy(int timeNumber, SampleByUnit timeType)
  1182. {
  1183. SampleByUnit sampleBy = timeType;
  1184. string sql = "SAMPLE BY "+timeNumber + sampleBy.ToString().Substring(0, 1).ToLower();
  1185. this.QueryBuilder.SampleBy = sql;
  1186. return this;
  1187. }
  1188. public ISugarQueryable<T> SampleBy(int timeNumber, string timeType)
  1189. {
  1190. string sql = "SAMPLE BY " + timeType;
  1191. this.QueryBuilder.SampleBy = sql;
  1192. return this;
  1193. }
  1194. public ISugarQueryable<T> OrderByPropertyName(string orderPropertyName, OrderByType? orderByType = null)
  1195. {
  1196. if (orderPropertyName.HasValue())
  1197. {
  1198. if (orderPropertyName.Contains(","))
  1199. {
  1200. foreach (var item in orderPropertyName.Split(','))
  1201. {
  1202. this.OrderByPropertyName(item,orderByType);
  1203. }
  1204. return this;
  1205. }
  1206. if (this.QueryBuilder.IsSingle() == false && orderPropertyName.Contains("."))
  1207. {
  1208. orderPropertyNameByJoin(orderPropertyName, orderByType);
  1209. return this;
  1210. }
  1211. if (this.Context.EntityMaintenance.GetEntityInfoWithAttr(typeof(T)).Columns.Any(it =>
  1212. it.DbColumnName?.EqualCase(orderPropertyName)==true
  1213. || it.PropertyName?.EqualCase(orderPropertyName)==true))
  1214. {
  1215. var name = this.Context.EntityMaintenance.GetEntityInfoWithAttr(typeof(T)).Columns.FirstOrDefault(it =>
  1216. it.DbColumnName?.EqualCase(orderPropertyName) == true
  1217. || it.PropertyName?.EqualCase(orderPropertyName) == true)?.DbColumnName;
  1218. return this.OrderBy(this.SqlBuilder.GetTranslationColumnName( name) + " "+orderByType);
  1219. }
  1220. else
  1221. {
  1222. Check.ExceptionEasy($"OrderByPropertyName error.{orderPropertyName} does not exist in the entity class", $"OrderByPropertyName出错实体类中不存在{orderPropertyName}");
  1223. }
  1224. }
  1225. return this;
  1226. }
  1227. public virtual ISugarQueryable<T> OrderBy(string orderByFields)
  1228. {
  1229. orderByFields = orderByFields.ToCheckField();
  1230. var orderByValue = QueryBuilder.OrderByValue;
  1231. if (QueryBuilder.OrderByValue.IsNullOrEmpty())
  1232. {
  1233. QueryBuilder.OrderByValue = QueryBuilder.OrderByTemplate;
  1234. }
  1235. QueryBuilder.OrderByValue += string.IsNullOrEmpty(orderByValue) ? orderByFields : ("," + orderByFields);
  1236. return this;
  1237. }
  1238. public virtual ISugarQueryable<T> OrderBy(Expression<Func<T, object>> expression, OrderByType type = OrderByType.Asc)
  1239. {
  1240. this._OrderBy(expression, type);
  1241. return this;
  1242. }
  1243. public virtual ISugarQueryable<T> OrderByDescending(Expression<Func<T, object>> expression)
  1244. {
  1245. this._OrderBy(expression, OrderByType.Desc);
  1246. return this;
  1247. }
  1248. public virtual ISugarQueryable<T> GroupBy(Expression<Func<T, object>> expression)
  1249. {
  1250. _GroupBy(expression);
  1251. return this;
  1252. }
  1253. public virtual ISugarQueryable<T> GroupByIF(bool isGroupBy,Expression<Func<T, object>> expression)
  1254. {
  1255. if (isGroupBy)
  1256. {
  1257. GroupBy(expression);
  1258. }
  1259. return this;
  1260. }
  1261. public ISugarQueryable<T> GroupByIF(bool isGroupBy, string groupFields)
  1262. {
  1263. if (isGroupBy)
  1264. {
  1265. GroupBy(groupFields);
  1266. }
  1267. return this;
  1268. }
  1269. public virtual ISugarQueryable<T> OrderByIF(bool isOrderBy, string orderByFields)
  1270. {
  1271. if (isOrderBy)
  1272. return this.OrderBy(orderByFields);
  1273. else
  1274. return this;
  1275. }
  1276. public virtual ISugarQueryable<T> OrderByIF(bool isOrderBy, Expression<Func<T, object>> expression, OrderByType type = OrderByType.Asc)
  1277. {
  1278. if (isOrderBy)
  1279. return this.OrderBy(expression, type);
  1280. else
  1281. return this;
  1282. }
  1283. public virtual ISugarQueryable<T> GroupBy(string groupFileds)
  1284. {
  1285. groupFileds = groupFileds.ToCheckField();
  1286. var croupByValue = QueryBuilder.GroupByValue;
  1287. if (QueryBuilder.GroupByValue.IsNullOrEmpty())
  1288. {
  1289. QueryBuilder.GroupByValue = QueryBuilder.GroupByTemplate;
  1290. }
  1291. QueryBuilder.GroupByValue += string.IsNullOrEmpty(croupByValue) ? groupFileds : ("," + groupFileds);
  1292. return this;
  1293. }
  1294. public virtual ISugarQueryable<T> PartitionBy(Expression<Func<T, object>> expression)
  1295. {
  1296. if (QueryBuilder.Take == null)
  1297. QueryBuilder.Take = 1;
  1298. _PartitionBy(expression);
  1299. QueryBuilder.DisableTop = true;
  1300. return this;
  1301. }
  1302. public virtual ISugarQueryable<T> PartitionBy(string groupFileds)
  1303. {
  1304. var partitionByValue = QueryBuilder.PartitionByValue;
  1305. if (QueryBuilder.PartitionByValue.IsNullOrEmpty())
  1306. {
  1307. QueryBuilder.PartitionByValue = QueryBuilder.PartitionByTemplate;
  1308. }
  1309. QueryBuilder.PartitionByValue += string.IsNullOrEmpty(partitionByValue) ? groupFileds : ("," + groupFileds);
  1310. return this;
  1311. }
  1312. public virtual ISugarQueryable<T> Skip(int num)
  1313. {
  1314. QueryBuilder.Skip = num;
  1315. return this;
  1316. }
  1317. public virtual ISugarQueryable<T> Take(int num)
  1318. {
  1319. QueryBuilder.Take = num;
  1320. return this;
  1321. }
  1322. public virtual ISugarQueryable<TResult> Select<TResult>(Expression expression)
  1323. {
  1324. if (IsAppendNavColumns())
  1325. {
  1326. SetAppendNavColumns(expression);
  1327. }
  1328. return _Select<TResult>(expression);
  1329. }
  1330. public ISugarQueryable<TResult> Select<TResult>(Dictionary<string, Type> keyIsShortName_ValueIsType_Dictionary, FormattableString expSelect, Type resultType)
  1331. {
  1332. var exp = DynamicCoreHelper.GetMember(keyIsShortName_ValueIsType_Dictionary, resultType, expSelect);
  1333. return _Select<TResult>(exp);
  1334. }
  1335. public ISugarQueryable<TResult> Select<TResult>(string expShortName, FormattableString expSelect, Type resultType)
  1336. {
  1337. var exp = DynamicCoreHelper.GetMember(typeof(TResult), resultType, expShortName, expSelect);
  1338. return _Select<TResult>(exp);
  1339. }
  1340. public ISugarQueryable<TResult> Select<TResult>(string expShortName, FormattableString expSelect,Type EntityType, Type resultType)
  1341. {
  1342. var exp = DynamicCoreHelper.GetMember(EntityType, resultType, expShortName, expSelect);
  1343. return _Select<TResult>(exp);
  1344. }
  1345. public ISugarQueryable<T> Select(string expShortName, FormattableString expSelect,Type resultType)
  1346. {
  1347. return Select<T>(expShortName, expSelect, resultType);
  1348. }
  1349. public virtual ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, TResult>> expression)
  1350. {
  1351. if (IsAppendNavColumns())
  1352. {
  1353. SetAppendNavColumns(expression);
  1354. }
  1355. return _Select<TResult>(expression);
  1356. }
  1357. public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, TResult>> expression, bool isAutoFill)
  1358. {
  1359. if (typeof(TResult).IsAnonymousType())
  1360. {
  1361. return Select(expression);
  1362. }
  1363. var clone = this.Select(expression).Clone();
  1364. //clone.QueryBuilder.LambdaExpressions.Index = QueryBuilder.LambdaExpressions.Index+1;
  1365. var ps = clone.QueryBuilder;
  1366. var sql = ps.GetSelectValue;
  1367. if (string.IsNullOrEmpty(sql) || sql.Trim() == "*")
  1368. {
  1369. this.QueryBuilder.SelectValue = null;
  1370. return this.Select<TResult>();
  1371. }
  1372. if (sql.StartsWith("*,"))
  1373. {
  1374. var columns = this.Context.EntityMaintenance.GetEntityInfo<T>()
  1375. .Columns.Where(it => typeof(TResult).GetProperties().Any(s => s.Name.EqualCase(it.PropertyName))).Where(it => it.IsIgnore == false).ToList();
  1376. if (columns.Any())
  1377. {
  1378. sql = string.Join(",", columns.Select(it => $"{SqlBuilder.GetTranslationColumnName(it.DbColumnName)} AS {SqlBuilder.GetTranslationColumnName(it.PropertyName)} "))
  1379. + "," + sql.TrimStart('*').TrimStart(',');
  1380. }
  1381. }
  1382. if (this.QueryBuilder.TableShortName.IsNullOrEmpty())
  1383. {
  1384. this.QueryBuilder.TableShortName = clone.QueryBuilder.TableShortName;
  1385. }
  1386. this.QueryBuilder.Parameters = ps.Parameters;
  1387. this.QueryBuilder.SubToListParameters = clone.QueryBuilder.SubToListParameters;
  1388. this.QueryBuilder.LambdaExpressions.ParameterIndex = clone.QueryBuilder.LambdaExpressions.ParameterIndex;
  1389. var parameters = (expression as LambdaExpression).Parameters;
  1390. var columnsResult = this.Context.EntityMaintenance.GetEntityInfo<TResult>().Columns;
  1391. sql = AppendSelect(this.EntityInfo.Columns,sql, parameters, columnsResult, 0);
  1392. return this.Select<TResult>(sql);
  1393. }
  1394. public virtual ISugarQueryable<TResult> Select<TResult>()
  1395. {
  1396. var isJoin = this.QueryBuilder.JoinExpression != null;
  1397. if (isJoin)
  1398. {
  1399. var selectValue = new SugarMapper(this.Context).GetSelectValue<TResult>(this.QueryBuilder);
  1400. return this.Select<TResult>(selectValue);
  1401. }
  1402. else if (this.QueryBuilder.EntityType == UtilConstants.ObjType || (this.QueryBuilder.AsTables != null && this.QueryBuilder.AsTables.Count == 1)||this.QueryBuilder.EntityName!=this.QueryBuilder.EntityType.Name)
  1403. {
  1404. if (this.QueryBuilder.SelectValue.HasValue()&& this.QueryBuilder.SelectValue.ObjToString().Contains("AS"))
  1405. {
  1406. return this.Select<TResult>(this.QueryBuilder.SelectValue+"");
  1407. }
  1408. else
  1409. {
  1410. return this.Select<TResult>(this.SqlBuilder.SqlSelectAll);
  1411. }
  1412. }
  1413. else
  1414. {
  1415. var selects = this.QueryBuilder.GetSelectValueByString();
  1416. if (selects.ObjToString().ToLower().IsContainsIn(".","("," as "))
  1417. {
  1418. return this.Select<TResult>(selects);
  1419. }
  1420. var resultColumns=this.Context.EntityMaintenance.GetEntityInfo<TResult>().Columns;
  1421. var dbColumns = this.EntityInfo.Columns.Where(it=>!it.IsIgnore);
  1422. StringBuilder sb = new StringBuilder();
  1423. foreach (var item in resultColumns)
  1424. {
  1425. var firstColumn= dbColumns.FirstOrDefault(z =>
  1426. z.PropertyName.EqualCase(item.PropertyName) ||
  1427. z.DbColumnName.EqualCase(item.PropertyName));
  1428. if (firstColumn != null)
  1429. {
  1430. var dbColumnName = firstColumn.DbColumnName;
  1431. var AsName = item.PropertyName;
  1432. sb.Append($"{this.SqlBuilder.GetTranslationColumnName(dbColumnName)} AS {this.SqlBuilder.GetTranslationColumnName(AsName)} ,");
  1433. }
  1434. }
  1435. selects = sb.ToString().TrimEnd(',');
  1436. if (selects == "")
  1437. {
  1438. selects = "*";
  1439. }
  1440. return this.Select<TResult>(selects);
  1441. }
  1442. }
  1443. public virtual ISugarQueryable<TResult> Select<TResult>(string selectValue)
  1444. {
  1445. var result = InstanceFactory.GetQueryable<TResult>(this.Context.CurrentConnectionConfig);
  1446. result.Context = this.Context;
  1447. result.SqlBuilder = this.SqlBuilder;
  1448. result.QueryBuilder.ResultType = this.QueryBuilder.ResultType;
  1449. result.IsCache = this.IsCache;
  1450. result.CacheTime = this.CacheTime;
  1451. QueryBuilder.SelectValue = selectValue;
  1452. if (this.IsAs)
  1453. {
  1454. ((QueryableProvider<TResult>)result).IsAs = true;
  1455. }
  1456. return result;
  1457. }
  1458. public virtual ISugarQueryable<T> Select(string selectValue)
  1459. {
  1460. QueryBuilder.SelectValue = selectValue;
  1461. return this;
  1462. }
  1463. public virtual ISugarQueryable<TResult> SelectMergeTable<TResult>(Expression<Func<T, TResult>> expression)
  1464. {
  1465. return this.Select(expression).MergeTable();
  1466. }
  1467. public virtual ISugarQueryable<T> MergeTable()
  1468. {
  1469. if (IsSubToList())
  1470. {
  1471. return MergeTableWithSubToList();
  1472. }
  1473. Check.Exception(this.MapperAction != null || this.MapperActionWithCache != null, ErrorMessage.GetThrowMessage("'Mapper’ needs to be written after ‘MergeTable’ ", "Mapper 只能在 MergeTable 之后使用"));
  1474. //Check.Exception(this.QueryBuilder.SelectValue.IsNullOrEmpty(),ErrorMessage.GetThrowMessage( "MergeTable need to use Queryable.Select Method .", "使用MergeTable之前必须要有Queryable.Select方法"));
  1475. //Check.Exception(this.QueryBuilder.Skip > 0 || this.QueryBuilder.Take > 0 || this.QueryBuilder.OrderByValue.HasValue(),ErrorMessage.GetThrowMessage( "MergeTable Queryable cannot Take Skip OrderBy PageToList ", "使用 MergeTable不能有 Take Skip OrderBy PageToList 等操作,你可以在Mergetable之后操作"));
  1476. var sqlobj = this._ToSql();
  1477. if (IsSubToList())
  1478. {
  1479. return MergeTableWithSubToListJoin();
  1480. }
  1481. var index = QueryBuilder.WhereIndex + 1;
  1482. var result =
  1483. this.EntityInfo.Discrimator.HasValue()?
  1484. this.Context.Queryable<object>().AS(SqlBuilder.GetPackTable(sqlobj.Key, "MergeTable")).AddParameters(sqlobj.Value).Select<T>("*").With(SqlWith.Null)
  1485. :
  1486. this.Context.Queryable<T>().AS(SqlBuilder.GetPackTable(sqlobj.Key, "MergeTable")).AddParameters(sqlobj.Value).Select("*").With(SqlWith.Null);
  1487. result.QueryBuilder.WhereIndex = index;
  1488. result.QueryBuilder.NoCheckInclude = true;
  1489. result.QueryBuilder.Includes = this.QueryBuilder.Includes;
  1490. result.QueryBuilder.AppendNavInfo = this.QueryBuilder.AppendNavInfo;
  1491. result.QueryBuilder.LambdaExpressions.ParameterIndex = QueryBuilder.LambdaExpressions.ParameterIndex++;
  1492. result.QueryBuilder.LambdaExpressions.Index = QueryBuilder.LambdaExpressions.Index++;
  1493. result.QueryBuilder.IsCrossQueryWithAttr = QueryBuilder.IsCrossQueryWithAttr;
  1494. if (this.Context.CurrentConnectionConfig.DbType == DbType.Oracle)
  1495. {
  1496. result.Select("MergeTable.*");
  1497. }
  1498. return result;
  1499. }
  1500. public ISugarQueryable<T> SplitTable()
  1501. {
  1502. UtilMethods.StartCustomSplitTable(this.Context, typeof(T));
  1503. //all table
  1504. return this.SplitTable(tag => tag);
  1505. }
  1506. public ISugarQueryable<T> SplitTable(DateTime beginTime, DateTime endTime)
  1507. {
  1508. UtilMethods.StartCustomSplitTable(this.Context, typeof(T));
  1509. var splitColumn = this.EntityInfo.Columns.FirstOrDefault(it => it.PropertyInfo.GetCustomAttribute<SplitFieldAttribute>() != null);
  1510. Check.ExceptionEasy(splitColumn==null,"[SplitFieldAttribute] need to be added to the table field", "需要在分表字段加上属性[SplitFieldAttribute]");
  1511. var columnName = this.SqlBuilder.GetTranslationColumnName(splitColumn.DbColumnName);
  1512. var sqlParameterKeyWord = this.SqlBuilder.SqlParameterKeyWord;
  1513. var resultQueryable= this.Where($" {columnName}>={sqlParameterKeyWord}spBeginTime AND {columnName}<= {sqlParameterKeyWord}spEndTime",new { spBeginTime = beginTime , spEndTime = endTime}).SplitTable(tas => {
  1514. var result = tas;
  1515. var type= this.EntityInfo.Type.GetCustomAttribute<SplitTableAttribute>();
  1516. Check.ExceptionEasy(type == null, $"{this.EntityInfo.EntityName}need SplitTableAttribute", $"{this.EntityInfo.EntityName}需要特性 SplitTableAttribute");
  1517. if (SplitType.Month == type.SplitType)
  1518. {
  1519. result = result.Where(y => y.Date >= beginTime.ToString("yyyy-MM").ObjToDate() && y.Date <= endTime.Date.ToString("yyyy-MM").ObjToDate().AddMonths(1).AddDays(-1)).ToList();
  1520. }
  1521. else if (SplitType.Year == type.SplitType)
  1522. {
  1523. result = result.Where(y => y.Date.Year >= beginTime.Year && y.Date.Year <= endTime.Year).ToList();
  1524. }
  1525. else if (SplitType.Week == type.SplitType)
  1526. {
  1527. var begtinWeek = UtilMethods.GetWeekFirstDayMon(beginTime).Date;
  1528. var endWeek = UtilMethods.GetWeekLastDaySun(endTime).Date;
  1529. result = result.Where(y =>
  1530. y.Date >= begtinWeek&& y.Date <= endWeek).ToList();
  1531. }
  1532. else if (SplitType.Month_6 == type.SplitType)
  1533. {
  1534. var begtinWeek = beginTime.Month<=6?beginTime.ToString("yyyy-01-01"): beginTime.ToString("yyyy-06-01");
  1535. var endWeek = endTime.Month <= 6 ? endTime.ToString("yyyy-07-01") : endTime.ToString("yyyy-12-01");
  1536. result = result.Where(y =>
  1537. y.Date >= begtinWeek.ObjToDate() && y.Date <= endWeek.ObjToDate().AddMonths(1).AddDays(-1)).ToList();
  1538. }
  1539. else if (SplitType.Season == type.SplitType)
  1540. {
  1541. var beginSeason= Convert.ToDateTime( beginTime.AddMonths(0 - ((beginTime.Month - 1) % 3)).ToString("yyyy-MM-01")).Date;
  1542. var endSeason= DateTime.Parse(endTime.AddMonths(3 - ((endTime.Month - 1) % 3)).ToString("yyyy-MM-01")).AddDays(-1).Date;
  1543. result = result.Where(y =>
  1544. y.Date >= beginSeason && y.Date <= endSeason).ToList();
  1545. }
  1546. else
  1547. {
  1548. result = result.Where(y => y.Date >= beginTime.Date && y.Date <= endTime.Date).ToList();
  1549. }
  1550. return result;
  1551. });
  1552. if (splitColumn.SqlParameterDbType is System.Data.DbType)
  1553. {
  1554. foreach (var item in resultQueryable.QueryBuilder.Parameters)
  1555. {
  1556. if (item.ParameterName.IsContainsIn("spBeginTime", "spEndTime"))
  1557. {
  1558. item.DbType =(System.Data.DbType)splitColumn.SqlParameterDbType;
  1559. }
  1560. }
  1561. }
  1562. return resultQueryable;
  1563. }
  1564. public ISugarQueryable<T> SplitTable(Func<List<SplitTableInfo>, IEnumerable<SplitTableInfo>> getTableNamesFunc)
  1565. {
  1566. UtilMethods.StartCustomSplitTable(this.Context, typeof(T));
  1567. SplitTableContext helper = new SplitTableContext(Context)
  1568. {
  1569. EntityInfo = this.EntityInfo
  1570. };
  1571. this.Context.MappingTables.Add(this.EntityInfo.EntityName, this.EntityInfo.DbTableName);
  1572. var tables = getTableNamesFunc(helper.GetTables());
  1573. List<ISugarQueryable<T>> tableQueryables = new List<ISugarQueryable<T>>();
  1574. foreach (var item in tables)
  1575. {
  1576. tableQueryables.Add(this.Clone().AS(item.TableName));
  1577. }
  1578. if (tableQueryables.Count == 0)
  1579. {
  1580. var result= this.Context.SqlQueryable<object>("-- No table ").Select<T>();
  1581. result.QueryBuilder.SelectValue = null;
  1582. return result;
  1583. }
  1584. else
  1585. {
  1586. if (this.Context.QueryFilter.Any())
  1587. {
  1588. foreach (var item in tableQueryables)
  1589. {
  1590. item.QueryBuilder.AppendFilter();
  1591. }
  1592. }
  1593. var unionall = this.Context._UnionAll(tableQueryables.ToArray());
  1594. unionall.QueryBuilder.Includes = this.QueryBuilder.Includes;
  1595. if (unionall.QueryBuilder.Includes?.Any()==true)
  1596. {
  1597. unionall.QueryBuilder.NoCheckInclude = true;
  1598. }
  1599. return unionall;
  1600. }
  1601. //var values= unionall.QueryBuilder.GetSelectValue;
  1602. //unionall.QueryBuilder.SelectValue = values;
  1603. }
  1604. public ISugarQueryable<T> WithCache(string cacheKey, int cacheDurationInSeconds = int.MaxValue)
  1605. {
  1606. cacheDurationInSeconds = SetCacheTime(cacheDurationInSeconds);
  1607. Check.ArgumentNullException(this.Context.CurrentConnectionConfig.ConfigureExternalServices.DataInfoCacheService, "Use Cache ConnectionConfig.ConfigureExternalServices.DataInfoCacheService is required ");
  1608. this.IsCache = true;
  1609. this.CacheTime = cacheDurationInSeconds;
  1610. this.CacheKey = cacheKey;
  1611. return this;
  1612. }
  1613. public ISugarQueryable<T> WithCache(int cacheDurationInSeconds = int.MaxValue)
  1614. {
  1615. cacheDurationInSeconds = SetCacheTime(cacheDurationInSeconds);
  1616. Check.ArgumentNullException(this.Context.CurrentConnectionConfig.ConfigureExternalServices.DataInfoCacheService, "Use Cache ConnectionConfig.ConfigureExternalServices.DataInfoCacheService is required ");
  1617. this.IsCache = true;
  1618. this.CacheTime = cacheDurationInSeconds;
  1619. return this;
  1620. }
  1621. public ISugarQueryable<T> WithCacheIF(bool isCache, int cacheDurationInSeconds = int.MaxValue)
  1622. {
  1623. cacheDurationInSeconds = SetCacheTime(cacheDurationInSeconds);
  1624. if (isCache)
  1625. {
  1626. this.IsCache = true;
  1627. this.CacheTime = cacheDurationInSeconds;
  1628. }
  1629. return this;
  1630. }
  1631. public ISugarQueryable<T> Distinct()
  1632. {
  1633. QueryBuilder.IsDistinct = true;
  1634. return this;
  1635. }
  1636. }
  1637. }