QueryMethodInfo.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Reflection;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. namespace SqlSugar
  8. {
  9. public class QueryMethodInfo
  10. {
  11. public object QueryableObj { get; internal set; }
  12. public SqlSugarProvider Context { get; internal set; }
  13. public Type EntityType { get; set; }
  14. #region Json 2 sql api
  15. #endregion
  16. #region Sql API
  17. public QueryMethodInfo AS(string tableName)
  18. {
  19. string shortName = $"{tableName}_1";
  20. var method = QueryableObj.GetType().GetMyMethod("AS", 2, typeof(string), typeof(string));
  21. this.QueryableObj = method.Invoke(QueryableObj, new object[] { tableName, shortName });
  22. return this;
  23. }
  24. public QueryMethodInfo AS(string tableName, string shortName)
  25. {
  26. var method = QueryableObj.GetType().GetMyMethod("AS", 2, typeof(string), typeof(string));
  27. this.QueryableObj = method.Invoke(QueryableObj, new object[] { tableName, shortName });
  28. return this;
  29. }
  30. public QueryMethodInfo OrderBy(List<OrderByModel> models)
  31. {
  32. var method = QueryableObj.GetType().GetMyMethod("OrderBy", 1, typeof(List<OrderByModel>));
  33. this.QueryableObj = method.Invoke(QueryableObj, new object[] { models });
  34. return this;
  35. }
  36. public QueryMethodInfo OrderBy(string orderBySql)
  37. {
  38. var method = QueryableObj.GetType().GetMyMethod("OrderBy", 1, typeof(string));
  39. this.QueryableObj = method.Invoke(QueryableObj, new object[] { orderBySql });
  40. return this;
  41. }
  42. public QueryMethodInfo AddJoinInfo(string tableName, string shortName,string onWhere, JoinType type = JoinType.Left)
  43. {
  44. var method = QueryableObj.GetType().GetMyMethod("AddJoinInfo", 4, typeof(string),typeof(string),typeof(string),typeof(JoinType));
  45. this.QueryableObj = method.Invoke(QueryableObj, new object[] { tableName,shortName,onWhere,type });
  46. return this;
  47. }
  48. public QueryMethodInfo AddJoinInfo(string tableName, string shortName, IFuncModel onFunc, JoinType type = JoinType.Left)
  49. {
  50. var method = QueryableObj.GetType().GetMyMethod("AddJoinInfo", 4, typeof(string), typeof(string), typeof(IFuncModel), typeof(JoinType));
  51. this.QueryableObj = method.Invoke(QueryableObj, new object[] { tableName, shortName, onFunc, type });
  52. return this;
  53. }
  54. public QueryMethodInfo AddJoinInfo(List<JoinInfoParameter> joinInfoParameters)
  55. {
  56. foreach (var item in joinInfoParameters)
  57. {
  58. AddJoinInfo(item.TableName,item.ShortName,item.Models,item.Type);
  59. }
  60. return this;
  61. }
  62. public QueryMethodInfo AddJoinInfo(Type joinEntityType,Dictionary<string,Type> keyIsShortName_ValueIsType_Dictionary, FormattableString expOnWhere, JoinType type = JoinType.Left)
  63. {
  64. var method = QueryableObj.GetType().GetMyMethod("AddJoinInfo", 4,typeof(Type), typeof(Dictionary<string, Type>), typeof(FormattableString), typeof(JoinType));
  65. this.QueryableObj = method.Invoke(QueryableObj, new object[] { joinEntityType, keyIsShortName_ValueIsType_Dictionary, expOnWhere, type });
  66. return this;
  67. }
  68. public QueryMethodInfo AddJoinInfo(Type joinEntityType, string shortName, string onWhere, JoinType type = JoinType.Left)
  69. {
  70. var method = QueryableObj.GetType().GetMyMethod("AddJoinInfo", 4, typeof(string), typeof(string), typeof(string), typeof(JoinType));
  71. this.QueryableObj = method.Invoke(QueryableObj, new object[] { this.Context.EntityMaintenance.GetTableName(joinEntityType), shortName, onWhere, type });
  72. return this;
  73. }
  74. public QueryMethodInfo GroupBy(List<GroupByModel> models)
  75. {
  76. var method = QueryableObj.GetType().GetMyMethod("GroupBy", 1, typeof(List<GroupByModel>));
  77. this.QueryableObj = method.Invoke(QueryableObj, new object[] { models });
  78. return this;
  79. }
  80. public QueryMethodInfo GroupBy(string groupBySql)
  81. {
  82. var method = QueryableObj.GetType().GetMyMethod("GroupBy", 1, typeof(string));
  83. this.QueryableObj = method.Invoke(QueryableObj, new object[] { groupBySql });
  84. return this;
  85. }
  86. public QueryMethodInfo Where(string expShortName, FormattableString expressionString)
  87. {
  88. var method = QueryableObj.GetType().GetMyMethod("Where", 2, typeof(string),typeof(FormattableString));
  89. this.QueryableObj = method.Invoke(QueryableObj, new object[] { expShortName, expressionString });
  90. return this;
  91. }
  92. public QueryMethodInfo Where(Dictionary<string, Type> keyIsShortName_ValueIsType_Dictionary, FormattableString expressionString)
  93. {
  94. var method = QueryableObj.GetType().GetMyMethod("Where", 2, typeof(Dictionary<string, Type>), typeof(FormattableString));
  95. this.QueryableObj = method.Invoke(QueryableObj, new object[] { keyIsShortName_ValueIsType_Dictionary, expressionString });
  96. return this;
  97. }
  98. public QueryMethodInfo Where(List<IConditionalModel> conditionalModels)
  99. {
  100. var method = QueryableObj.GetType().GetMyMethod("Where", 1, typeof(List<IConditionalModel>));
  101. this.QueryableObj = method.Invoke(QueryableObj, new object[] { conditionalModels });
  102. return this;
  103. }
  104. public QueryMethodInfo Where(IFuncModel model)
  105. {
  106. var method = QueryableObj.GetType().GetMyMethod("Where", 1, typeof(IFuncModel));
  107. this.QueryableObj = method.Invoke(QueryableObj, new object[] { model });
  108. return this;
  109. }
  110. public QueryMethodInfo Where(List<IConditionalModel> conditionalModels, bool isWrap)
  111. {
  112. var method = QueryableObj.GetType().GetMyMethod("Where", 2, typeof(List<IConditionalModel>),typeof(bool));
  113. this.QueryableObj = method.Invoke(QueryableObj, new object[] { conditionalModels,isWrap });
  114. return this;
  115. }
  116. public QueryMethodInfo Where(string sql, object parameters = null)
  117. {
  118. var method = QueryableObj.GetType().GetMyMethodNoGen("Where", 2, typeof(string), typeof(object));
  119. this.QueryableObj = method.Invoke(QueryableObj, new object[] { sql, parameters });
  120. return this;
  121. }
  122. public QueryMethodInfo Having(IFuncModel model)
  123. {
  124. var method = QueryableObj.GetType().GetMyMethod("Having", 1, typeof(IFuncModel));
  125. this.QueryableObj = method.Invoke(QueryableObj, new object[] {model});
  126. return this;
  127. }
  128. public QueryMethodInfo Having(string sql, object parameters = null)
  129. {
  130. var method = QueryableObj.GetType().GetMyMethod("Having", 2, typeof(string), typeof(object));
  131. this.QueryableObj = method.Invoke(QueryableObj, new object[] { sql, parameters });
  132. return this;
  133. }
  134. public QueryMethodInfo SplitTable(Func<List<SplitTableInfo>, IEnumerable<SplitTableInfo>> getTableNamesFunc)
  135. {
  136. var method = QueryableObj.GetType().GetMyMethod("SplitTable", 1, typeof(Func<List<SplitTableInfo>, IEnumerable<SplitTableInfo>>));
  137. this.QueryableObj = method.Invoke(QueryableObj, new object[] { getTableNamesFunc });
  138. return this;
  139. }
  140. public QueryMethodInfo SplitTable(DateTime begintTime, DateTime endTime)
  141. {
  142. var method = QueryableObj.GetType().GetMyMethod("SplitTable", 2, typeof(DateTime), typeof(DateTime));
  143. this.QueryableObj = method.Invoke(QueryableObj, new object[] { begintTime, endTime });
  144. return this;
  145. }
  146. public QueryMethodInfo SplitTable()
  147. {
  148. var method = QueryableObj.GetType().GetMyMethod("SplitTable", 0);
  149. this.QueryableObj = method.Invoke(QueryableObj, new object[] { });
  150. return this;
  151. }
  152. public QueryMethodInfo Select(List<SelectModel> models)
  153. {
  154. var method = QueryableObj.GetType().GetMyMethod("Select", 1, typeof(List<SelectModel>));
  155. this.QueryableObj = method.Invoke(QueryableObj, new object[] { models });
  156. return this;
  157. }
  158. public QueryMethodInfo Select(string expShortName, FormattableString expSelect, Type resultType)
  159. {
  160. var method = QueryableObj.GetType().GetMyMethod("Select", 3, typeof(string),typeof(FormattableString),typeof(Type));
  161. method= method.MakeGenericMethod(resultType);
  162. this.QueryableObj = method.Invoke(QueryableObj, new object[] { expShortName, expSelect, resultType });
  163. return this;
  164. }
  165. public QueryMethodInfo Select(Dictionary<string, Type> keyIsShortName_ValueIsType_Dictionary, FormattableString expSelect, Type resultType)
  166. {
  167. var method = QueryableObj.GetType().GetMyMethod("Select", 3, typeof(Dictionary<string, Type>), typeof(FormattableString), typeof(Type));
  168. method = method.MakeGenericMethod(resultType);
  169. this.QueryableObj = method.Invoke(QueryableObj, new object[] { keyIsShortName_ValueIsType_Dictionary, expSelect, resultType });
  170. return this;
  171. }
  172. public QueryMethodInfo Select(string selectorSql)
  173. {
  174. var method = QueryableObj.GetType().GetMyMethod("Select", 1, typeof(string))
  175. .MakeGenericMethod(EntityType);
  176. this.QueryableObj = method.Invoke(QueryableObj, new object[] { selectorSql });
  177. return this;
  178. }
  179. public QueryMethodInfo Select(string selectorSql, Type selectType)
  180. {
  181. var method = QueryableObj.GetType().GetMyMethod("Select", 1, typeof(string))
  182. .MakeGenericMethod(selectType);
  183. this.QueryableObj = method.Invoke(QueryableObj, new object[] { selectorSql });
  184. return this;
  185. }
  186. #endregion
  187. #region Nav
  188. public QueryMethodInfo IncludesAllFirstLayer(params string[] ignoreNavPropertyNames)
  189. {
  190. var method = QueryableObj.GetType().GetMyMethod("IncludesAllFirstLayer",1,typeof(string[]));
  191. this.QueryableObj = method.Invoke(QueryableObj, new object[] { ignoreNavPropertyNames });
  192. return this;
  193. }
  194. public QueryMethodInfo Includes(string navProperyName)
  195. {
  196. var method = QueryableObj.GetType().GetMyMethod("IncludesByNameString", 1, typeof(string));
  197. this.QueryableObj = method.Invoke(QueryableObj, new object[] { navProperyName });
  198. return this;
  199. }
  200. public QueryMethodInfo IgnoreColumns(params string [] ignoreColumns)
  201. {
  202. var method = QueryableObj.GetType().GetMyMethod("IgnoreColumns", 1, typeof(string[]));
  203. this.QueryableObj = method.Invoke(QueryableObj, new object[] { ignoreColumns });
  204. return this;
  205. }
  206. public QueryMethodInfo Includes(string navProperyName,string thenNavProperyName2)
  207. {
  208. var method = QueryableObj.GetType().GetMyMethod("IncludesByNameString", 2, typeof(string),typeof(string));
  209. this.QueryableObj = method.Invoke(QueryableObj, new object[] { navProperyName , thenNavProperyName2 });
  210. return this;
  211. }
  212. public QueryMethodInfo Includes(string navProperyName, string thenNavProperyName2, string thenNavProperyName3)
  213. {
  214. var method = QueryableObj.GetType().GetMyMethod("IncludesByNameString", 3, typeof(string), typeof(string),typeof(string));
  215. this.QueryableObj = method.Invoke(QueryableObj, new object[] { navProperyName, thenNavProperyName2 , thenNavProperyName3 });
  216. return this;
  217. }
  218. #endregion
  219. #region Result
  220. public object ToPageList(int pageNumber, int pageSize)
  221. {
  222. var method = QueryableObj.GetType().GetMyMethod("ToPageList", 2, typeof(int), typeof(int));
  223. var reslt = method.Invoke(QueryableObj, new object[] { pageNumber, pageSize });
  224. return reslt;
  225. }
  226. public object ToPageList(int pageNumber, int pageSize, ref int count)
  227. {
  228. var method = QueryableObj.GetType().GetMyMethod("ToPageList", 3, typeof(int), typeof(int), typeof(int).MakeByRefType());
  229. var parameters = new object[] { pageNumber, pageSize, count };
  230. var reslt = method.Invoke(QueryableObj, parameters);
  231. count = parameters.Last().ObjToInt();
  232. return reslt;
  233. }
  234. public object ToList()
  235. {
  236. var method = QueryableObj.GetType().GetMyMethod("ToList", 0);
  237. var reslt = method.Invoke(QueryableObj, new object[] { });
  238. return reslt;
  239. }
  240. public string ToSqlString()
  241. {
  242. var method = QueryableObj.GetType().GetMyMethod("ToSqlString", 0);
  243. var reslt = method.Invoke(QueryableObj, new object[] { });
  244. return (string)reslt;
  245. }
  246. public KeyValuePair<string, List<SugarParameter>> ToSql()
  247. {
  248. var method = QueryableObj.GetType().GetMyMethod("ToSql", 0);
  249. var reslt = method.Invoke(QueryableObj, new object[] { });
  250. return (KeyValuePair<string, List<SugarParameter>>)reslt;
  251. }
  252. public object InSingle(object pkValue)
  253. {
  254. var method = QueryableObj.GetType().GetMyMethod("InSingle", 1);
  255. var reslt = method.Invoke(QueryableObj, new object[] { pkValue });
  256. return reslt;
  257. }
  258. public bool CreateView(string viewNameFomat)
  259. {
  260. if (viewNameFomat?.Contains("{0}")!=true)
  261. {
  262. Check.ExceptionEasy("need{0}", "需要{0}表名的占位符");
  263. }
  264. var entityInfo = this.Context.EntityMaintenance.GetEntityInfo(EntityType);
  265. var viewName = string.Format(viewNameFomat, entityInfo.DbTableName);
  266. if (!this.Context.DbMaintenance.GetViewInfoList().Any(it => it.Name.EqualCase(viewName))) {
  267. var method = QueryableObj.GetType().GetMyMethod("ToSqlString", 0);
  268. var reslt = (string)method.Invoke(QueryableObj, new object[] { });
  269. var sql = $"CREATE VIEW {viewName} AS {Environment.NewLine} {reslt}";
  270. this.Context.Ado.ExecuteCommand(sql);
  271. return true;
  272. }
  273. else
  274. {
  275. return false;
  276. }
  277. }
  278. public object First()
  279. {
  280. var method = QueryableObj.GetType().GetMyMethod("First", 0);
  281. var reslt = method.Invoke(QueryableObj, new object[] { });
  282. return reslt;
  283. }
  284. public bool Any()
  285. {
  286. var method = QueryableObj.GetType().GetMyMethod("Any", 0);
  287. var reslt = method.Invoke(QueryableObj, new object[] { });
  288. return Convert.ToBoolean(reslt);
  289. }
  290. public object ToTree(string childPropertyName, string parentIdPropertyName, object rootValue, string primaryKeyPropertyName)
  291. {
  292. var method = QueryableObj.GetType().GetMyMethod("ToTree", 4,typeof(string),typeof(string),typeof(object),typeof(string));
  293. var reslt = method.Invoke(QueryableObj, new object[] {childPropertyName,parentIdPropertyName,rootValue,primaryKeyPropertyName });
  294. return reslt;
  295. }
  296. #endregion
  297. #region Result Async
  298. public async Task<object> ToPageListAsync(int pageNumber, int pageSize)
  299. {
  300. var method = QueryableObj.GetType().GetMyMethod("ToPageListAsync", 2, typeof(int), typeof(int));
  301. Task task = (Task)method.Invoke(QueryableObj, new object[] { pageNumber, pageSize });
  302. return await GetTask(task).ConfigureAwait(false);
  303. }
  304. public async Task<object> ToPageListAsync(int pageNumber, int pageSize, RefAsync<int> count)
  305. {
  306. var method = QueryableObj.GetType().GetMyMethod("ToPageListAsync", 3, typeof(int), typeof(int),typeof( RefAsync<int>));
  307. var parameters = new object[] { pageNumber, pageSize, count };
  308. var task = (Task)method.Invoke(QueryableObj, parameters);
  309. return await GetTask(task).ConfigureAwait(false);
  310. }
  311. public async Task<object> ToListAsync()
  312. {
  313. var method = QueryableObj.GetType().GetMyMethod("ToListAsync", 0);
  314. var task = (Task)method.Invoke(QueryableObj, new object[] { });
  315. return await GetTask(task).ConfigureAwait(false);
  316. }
  317. public async Task<object> FirstAsync()
  318. {
  319. var method = QueryableObj.GetType().GetMyMethod("FirstAsync", 0);
  320. var task = (Task)method.Invoke(QueryableObj, new object[] { });
  321. return await GetTask(task).ConfigureAwait(false);
  322. }
  323. public async Task<bool> AnyAsync()
  324. {
  325. var method = QueryableObj.GetType().GetMyMethod("AnyAsync", 0);
  326. var reslt = method.Invoke(QueryableObj, new object[] { });
  327. return await (Task<bool>) reslt;
  328. }
  329. public async Task<object> InSingleAsync(object pkValue)
  330. {
  331. var method = QueryableObj.GetType().GetMyMethod("InSingleAsync", 1);
  332. var task = (Task)method.Invoke(QueryableObj, new object[] { pkValue });
  333. return await GetTask(task).ConfigureAwait(false);
  334. }
  335. public async Task<object> ToTreeAsync(string childPropertyName, string parentIdPropertyName, object rootValue, string primaryKeyPropertyName)
  336. {
  337. var method = QueryableObj.GetType().GetMyMethod("ToTreeAsync", 4, typeof(string), typeof(string), typeof(object), typeof(string));
  338. var task =(Task)method.Invoke(QueryableObj, new object[] { childPropertyName, parentIdPropertyName, rootValue, primaryKeyPropertyName });
  339. return await GetTask(task).ConfigureAwait(false);
  340. }
  341. #endregion
  342. #region Helper
  343. private static async Task<object> GetTask(Task task)
  344. {
  345. await task.ConfigureAwait(false); // 等待任务完成
  346. var resultProperty = task.GetType().GetProperty("Result");
  347. var result = resultProperty.GetValue(task);
  348. return result;
  349. }
  350. #endregion
  351. }
  352. }