Queryable.cs 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Linq.Expressions;
  6. using Ant.Core;
  7. using Ant.Query.QueryExpressions;
  8. using Ant.Infrastructure;
  9. using Ant.Query.Internals;
  10. using System.Diagnostics;
  11. using Ant.Utility;
  12. using System.Reflection;
  13. using Ant.DbExpressions;
  14. using Ant.ORM;
  15. using Ant.ORM;
  16. using Ant.Common;
  17. using Ant.Data;
  18. using Ant.Frame;
  19. namespace Ant.Query
  20. {
  21. class Queryable<T> : QueryBase, IQuery<T>
  22. {
  23. static readonly List<Expression> EmptyParameterList = new List<Expression>(0);
  24. AntORM _dbContext;
  25. QueryExpression _expression;
  26. internal bool _trackEntity = false;//是否开启跟踪
  27. public AntORM DbContext { get { return this._dbContext; } }//数据库连接
  28. public static Stopwatch sw = new Stopwatch();
  29. public Queryable(AntORM dbContext)
  30. : this(dbContext, new RootQueryExpression(typeof(T)), false)
  31. {
  32. if (!sw.IsRunning)
  33. {
  34. sw = new Stopwatch();
  35. sw.Start();
  36. }
  37. //这边可以用于开始记时
  38. }
  39. public Queryable(AntORM dbContext, QueryExpression exp)
  40. : this(dbContext, exp, false)
  41. {
  42. if (!sw.IsRunning)
  43. {
  44. sw = new Stopwatch();
  45. sw.Start();
  46. }
  47. }
  48. public Queryable(AntORM dbContext, QueryExpression exp, bool trackEntity)
  49. {
  50. if (!sw.IsRunning)
  51. {
  52. sw = new Stopwatch();
  53. sw.Start();
  54. }
  55. this._dbContext = dbContext;
  56. this._expression = exp;
  57. this._trackEntity = trackEntity;
  58. }
  59. /// <summary>
  60. /// 数据库配置
  61. /// </summary>
  62. public DataAccess db
  63. {
  64. get; set;
  65. }
  66. /// <summary>
  67. /// 显示列
  68. /// </summary>
  69. /// <typeparam name="TResult"></typeparam>
  70. /// <param name="selector"></param>
  71. /// <returns></returns>
  72. public IQuery<TResult> Select<TResult>(Expression<Func<T, TResult>> selector)
  73. {
  74. AntUtils.CheckNull(selector);
  75. SelectExpression e = new SelectExpression(typeof(TResult), _expression, selector);
  76. return new Queryable<TResult>(this._dbContext, e, this._trackEntity);
  77. }
  78. /// <summary>
  79. /// 查询条件
  80. /// </summary>
  81. /// <param name="predicate"></param>
  82. /// <returns></returns>
  83. public IQuery<T> Where(Expression<Func<T, bool>> predicate)
  84. {
  85. AntUtils.CheckNull(predicate);
  86. WhereExpression e = new WhereExpression(_expression, typeof(T), predicate);
  87. return new Queryable<T>(this._dbContext, e, this._trackEntity);
  88. }
  89. /// <summary>
  90. /// 用IN作为查询条件的SQL语句
  91. /// </summary>
  92. /// <param name="propertySelector"></param>
  93. /// <param name="values"></param>
  94. /// <returns></returns>
  95. public IQuery<T> WhereIn(Expression<Func<T, object>> propertySelector, params object[] values)
  96. {
  97. return this.Where(BuildWhereInExpression(propertySelector, values));
  98. }
  99. /// <summary>
  100. ///
  101. /// </summary>
  102. /// <typeparam name="TElement"></typeparam>
  103. /// <typeparam name="TValue"></typeparam>
  104. /// <param name="propertySelector"></param>
  105. /// <param name="values"></param>
  106. /// <returns></returns>
  107. private Expression<Func<T, bool>> BuildWhereInExpression(Expression<Func<T, object>> propertySelector, IEnumerable<object> values)
  108. {
  109. ParameterExpression p = propertySelector.Parameters.Single();
  110. if (!values.Any())
  111. return e => false;
  112. var equals = values.Select(value => (Expression)Expression.Equal(propertySelector.Body, Expression.Constant(value, typeof(object))));
  113. var body = equals.Aggregate<Expression>((accumulate, equal) => Expression.Or(accumulate, equal));
  114. return Expression.Lambda<Func<T, bool>>(body, p);
  115. }
  116. /// <summary>
  117. /// 默认升序排序
  118. /// </summary>
  119. /// <typeparam name="K"></typeparam>
  120. /// <param name="predicate"></param>
  121. /// <returns></returns>
  122. public IOrderedQuery<T> OrderBy<K>(Expression<Func<T, K>> predicate)
  123. {
  124. AntUtils.CheckNull(predicate);
  125. OrderExpression e = new OrderExpression(QueryExpressionType.OrderBy, typeof(T), this._expression, predicate);
  126. return new OrderedQuery<T>(this._dbContext, e, this._trackEntity);
  127. }
  128. /// <summary>
  129. /// 降序排序
  130. /// </summary>
  131. /// <typeparam name="K"></typeparam>
  132. /// <param name="predicate"></param>
  133. /// <returns></returns>
  134. public IOrderedQuery<T> OrderByDesc<K>(Expression<Func<T, K>> predicate)
  135. {
  136. AntUtils.CheckNull(predicate);
  137. OrderExpression e = new OrderExpression(QueryExpressionType.OrderByDesc, typeof(T), this._expression, predicate);
  138. return new OrderedQuery<T>(this._dbContext, e, this._trackEntity);
  139. }
  140. /// <summary>
  141. /// 跳过
  142. /// </summary>
  143. /// <param name="count"></param>
  144. /// <returns></returns>
  145. public IQuery<T> Skip(int count)
  146. {
  147. SkipExpression e = new SkipExpression(typeof(T), this._expression, count);
  148. return new Queryable<T>(this._dbContext, e, this._trackEntity);
  149. }
  150. /// <summary>
  151. /// TOP取条数据
  152. /// </summary>
  153. /// <param name="count"></param>
  154. /// <returns></returns>
  155. public IQuery<T> Top(int count)
  156. {
  157. TakeExpression e = new TakeExpression(typeof(T), this._expression, count);
  158. return new Queryable<T>(this._dbContext, e, this._trackEntity);
  159. }
  160. /// <summary>
  161. /// 分组
  162. /// </summary>
  163. /// <typeparam name="K"></typeparam>
  164. /// <param name="predicate"></param>
  165. /// <returns></returns>
  166. public IGroupingQuery<T> GroupBy<K>(Expression<Func<T, K>> predicate)
  167. {
  168. AntUtils.CheckNull(predicate);
  169. return new GroupingQuery<T>(this, predicate);
  170. }
  171. /// <summary>
  172. /// 内连接
  173. /// </summary>
  174. /// <typeparam name="TSource"></typeparam>
  175. /// <param name="q"></param>
  176. /// <param name="on"></param>
  177. /// <returns></returns>
  178. public IJoiningQuery<T, TSource> InnerJoin<TSource>(IQuery<TSource> q, Expression<Func<T, TSource, bool>> on)
  179. {
  180. AntUtils.CheckNull(q);
  181. AntUtils.CheckNull(on);
  182. return new JoiningQuery<T, TSource>(this, (Queryable<TSource>)q, JoinType.InnerJoin, on);
  183. }
  184. /// <summary>
  185. /// 左关联
  186. /// </summary>
  187. /// <typeparam name="TSource"></typeparam>
  188. /// <param name="q"></param>
  189. /// <param name="on"></param>
  190. /// <returns></returns>
  191. public IJoiningQuery<T, TSource> LeftJoin<TSource>(IQuery<TSource> q, Expression<Func<T, TSource, bool>> on)
  192. {
  193. AntUtils.CheckNull(q);
  194. AntUtils.CheckNull(on);
  195. return new JoiningQuery<T, TSource>(this, (Queryable<TSource>)q, JoinType.LeftJoin, on);
  196. }
  197. /// <summary>
  198. /// 右关联
  199. /// </summary>
  200. /// <typeparam name="TSource"></typeparam>
  201. /// <param name="q"></param>
  202. /// <param name="on"></param>
  203. /// <returns></returns>
  204. public IJoiningQuery<T, TSource> RightJoin<TSource>(IQuery<TSource> q, Expression<Func<T, TSource, bool>> on)
  205. {
  206. AntUtils.CheckNull(q);
  207. AntUtils.CheckNull(on);
  208. return new JoiningQuery<T, TSource>(this, (Queryable<TSource>)q, JoinType.RightJoin, on);
  209. }
  210. /// <summary>
  211. /// 全连接
  212. /// </summary>
  213. /// <typeparam name="TSource"></typeparam>
  214. /// <param name="q"></param>
  215. /// <param name="on"></param>
  216. /// <returns></returns>
  217. public IJoiningQuery<T, TSource> FullJoin<TSource>(IQuery<TSource> q, Expression<Func<T, TSource, bool>> on)
  218. {
  219. AntUtils.CheckNull(q);
  220. AntUtils.CheckNull(on);
  221. return new JoiningQuery<T, TSource>(this, (Queryable<TSource>)q, JoinType.FullJoin, on);
  222. }
  223. public IJoiningQuery<T, TOther> InnerJoin<TOther>(Expression<Func<T, TOther, bool>> on)
  224. {
  225. return this.Join<TOther>(new Queryable<TOther>(this._dbContext), JoinType.InnerJoin, on);
  226. }
  227. public IJoiningQuery<T, TOther> Join<TOther>(IQuery<TOther> q, JoinType joinType, Expression<Func<T, TOther, bool>> on)
  228. {
  229. AntUtils.CheckNull(q);
  230. AntUtils.CheckNull(on);
  231. return new JoiningQuery<T, TOther>(this, (Queryable<TOther>)q, joinType, on);
  232. }
  233. public IJoiningQuery<T, TOther> LeftJoin<TOther>(Expression<Func<T, TOther, bool>> on)
  234. {
  235. return this.LeftJoin<TOther>(new Queryable<TOther>(this._dbContext), on);
  236. }
  237. public IJoiningQuery<T, TOther> RightJoin<TOther>(Expression<Func<T, TOther, bool>> on)
  238. {
  239. return this.RightJoin<TOther>(new Queryable<TOther>(this._dbContext), on);
  240. }
  241. public IJoiningQuery<T, TOther> FullJoin<TOther>(Expression<Func<T, TOther, bool>> on)
  242. {
  243. return this.FullJoin<TOther>(new Queryable<TOther>(this._dbContext), on);
  244. }
  245. #region 最终调用的方法
  246. /// <summary>
  247. ///
  248. /// </summary>
  249. /// <returns></returns>
  250. public ResponseModel First()
  251. {
  252. ResponseModel reslut = new ResponseModel();
  253. var q = (Queryable<T>)this.Top(1);
  254. if (q.db.IsNull() || q.db.IsUnEnable)
  255. q.db = DbContext.db;
  256. if (q.db.IsNull() || q.db.IsUnEnable)
  257. {
  258. reslut.IsSuccess = false;
  259. reslut.Message = "连接数据库配置不能为空";
  260. return reslut;
  261. }
  262. DbContext.DbContextServiceProvider = DbContext.CreateDataAccess(q.db);
  263. //IEnumerable<T> iterator = q.GenerateIterator();//原始写法
  264. InternalQuery<T> iterator = q.GenerateIterator();
  265. var mod = iterator.First();
  266. sw.Stop();
  267. if (mod != null)
  268. {
  269. reslut.IsSuccess = true;
  270. reslut.ResultModel = mod;
  271. reslut.Message = "查询成功耗时:" + sw.ElapsedMilliseconds;
  272. }
  273. else
  274. {
  275. reslut.Message = "数据库中没有您要查询的数据";
  276. }
  277. reslut.StrSql = iterator.ToString();
  278. reslut.DBConfig = iterator.GetDataConnection();
  279. return reslut;
  280. }
  281. /// <summary>
  282. /// 返回序列中的第一个元素,如果数据库查不到数据就会报错(注:用此方法就要保证数据能查到数据)
  283. /// </summary>
  284. /// <returns></returns>
  285. public ResponseModel First(RequestModel request)
  286. {
  287. ResponseModel reslut = new ResponseModel();
  288. var q = (Queryable<T>)this.Top(1);
  289. if (q.db.IsNull() || q.db.IsUnEnable)
  290. q.db = request.db;
  291. if (q.db.IsNull() || q.db.IsUnEnable)
  292. q.db = _dbContext.db;
  293. if (q.db.IsNull() || q.db.IsUnEnable)
  294. {
  295. reslut.IsSuccess = false;
  296. reslut.Message = "连接数据库配置不能为空";
  297. return reslut;
  298. }
  299. DbContext.DbContextServiceProvider = DbContext.CreateDataAccess(q.db);
  300. //IEnumerable<T> iterator = q.GenerateIterator();//原始写法
  301. InternalQuery<T> iterator = q.GenerateIterator();
  302. var mod = iterator.First();
  303. sw.Stop();
  304. if (mod != null)
  305. {
  306. reslut.IsSuccess = true;
  307. reslut.ResultModel = mod;
  308. reslut.Message = "查询成功耗时:" + sw.ElapsedMilliseconds;
  309. }
  310. else
  311. {
  312. reslut.Message = "数据库中没有您要查询的数据";
  313. }
  314. reslut.StrSql = iterator.ToString();
  315. reslut.DBConfig = iterator.GetDataConnection();
  316. return reslut;
  317. }
  318. /// <summary>
  319. /// 返回序列中的第一个元素
  320. /// </summary>
  321. /// <param name="predicate"></param>
  322. /// <returns></returns>
  323. public ResponseModel First(Expression<Func<T, bool>> predicate)
  324. {
  325. ResponseModel reslut = new ResponseModel();
  326. if (this.DbContext.db.IsNull() || this.DbContext.db.IsUnEnable)
  327. {
  328. reslut.IsSuccess = false;
  329. reslut.Message = "连接数据库配置不能为空";
  330. return reslut;
  331. }
  332. var mod = this.Where(predicate).First();
  333. if (mod != null)
  334. {
  335. reslut.IsSuccess = true;
  336. reslut.ResultModel = mod;
  337. DbContext.TrackEntity(mod);//这时只会更新被修改的字段
  338. reslut.Message = "数据返回成功";
  339. }
  340. else
  341. {
  342. reslut.Message = "数据库中没有您要查询的数据";
  343. }
  344. reslut.StrSql = this.ToString();
  345. reslut.DBConfig = this.GetDataConnection();
  346. return reslut;
  347. }
  348. /// <summary>
  349. /// 获取一条数据
  350. /// </summary>
  351. /// <returns></returns>
  352. public ResponseModel FirstOrDefault()
  353. {
  354. ResponseModel reslut = new ResponseModel();
  355. var q = (Queryable<T>)this.Top(1);
  356. if (q.db.IsNull() || q.db.IsUnEnable)
  357. {
  358. q.db = DbContext.db;
  359. }
  360. if (q.db.IsNull() || q.db.IsUnEnable)
  361. {
  362. reslut.IsSuccess = false;
  363. reslut.Message = "连接数据库配置不能为空";
  364. return reslut;
  365. }
  366. _dbContext.DbContextServiceProvider = DbContext.CreateDataAccess(q.db);
  367. //IEnumerable<T> iterator = q.GenerateIterator();//原始写法
  368. InternalQuery<T> iterator = q.GenerateIterator();
  369. var mod = iterator.FirstOrDefault();
  370. sw.Stop();
  371. if (mod != null)
  372. {
  373. reslut.IsSuccess = true;
  374. DbContext.TrackEntity(mod);//这时只会更新被修改的字段
  375. reslut.ResultModel = mod;
  376. reslut.Message = "查询成功耗时:" + sw.ElapsedMilliseconds;
  377. }
  378. else
  379. {
  380. reslut.Message = "数据库中没有您要查询的数据";
  381. }
  382. reslut.StrSql = iterator.ToString();
  383. reslut.DBConfig = iterator.GetDataConnection();
  384. return reslut;
  385. }
  386. /// <summary>
  387. /// 获取一条数据
  388. /// </summary>
  389. /// <returns></returns>
  390. public ResponseModel FirstOrDefault(RequestModel request)
  391. {
  392. ResponseModel reslut = new ResponseModel();
  393. try
  394. {
  395. var q = (Queryable<T>)this.Top(1);
  396. //IEnumerable<T> iterator = q.GenerateIterator();//原始写法
  397. if (q.db.IsNull() || q.db.IsUnEnable)
  398. q.db = DbContext.db;
  399. if (q.db.IsNull() || q.db.IsUnEnable)
  400. q.db = request.db;
  401. if (q.db.IsNull() || q.db.IsUnEnable)
  402. {
  403. reslut.IsSuccess = false;
  404. reslut.Message = "连接数据库配置不能为空";
  405. return reslut;
  406. }
  407. _dbContext.DbContextServiceProvider = DbContext.CreateDataAccess(q.db);
  408. InternalQuery<T> iterator = q.GenerateIterator();
  409. reslut.StrSql = iterator.ToString();
  410. reslut.DBConfig = iterator.GetDataConnection();
  411. var mod = iterator.FirstOrDefault();
  412. sw.Stop();
  413. if (mod != null)
  414. {
  415. reslut.IsSuccess = true;
  416. if (request.Tracking)
  417. {
  418. DbContext.TrackEntity(mod);//这时只会更新被修改的字段
  419. }
  420. reslut.ResultModel = mod;
  421. reslut.Message = "查询成功耗时:" + sw.ElapsedMilliseconds;
  422. }
  423. else
  424. {
  425. reslut.Message = "数据库中没有您要查询的数据";
  426. }
  427. }
  428. catch (Exception ex)
  429. {
  430. reslut.IsSuccess = false;
  431. reslut.Message = ex.ToString();
  432. }
  433. return reslut;
  434. }
  435. /// <summary>
  436. /// 获取一条数据
  437. /// </summary>
  438. /// <param name="predicate"></param>
  439. /// <param name="request"></param>
  440. /// <returns></returns>
  441. public ResponseModel FirstOrDefault(Expression<Func<T, bool>> predicate, RequestModel request)
  442. {
  443. ResponseModel reslut = new ResponseModel();
  444. var q = (Queryable<T>)this.Top(1);
  445. if (q.db.IsNull() || q.db.IsUnEnable)
  446. q.db = DbContext.db;
  447. if (q.db.IsNull() || q.db.IsUnEnable)
  448. q.db = request.db;
  449. if (q.db.IsNull() || q.db.IsUnEnable)
  450. {
  451. reslut.IsSuccess = false;
  452. reslut.Message = "连接数据库配置不能为空";
  453. return reslut;
  454. }
  455. var mod = q.Where(predicate).FirstOrDefault();
  456. if (request.Tracking)
  457. {
  458. DbContext.TrackEntity(mod);//这时只会更新被修改的字段
  459. }
  460. reslut.ResultModel = mod;
  461. sw.Stop();
  462. if (mod != null)
  463. {
  464. reslut.IsSuccess = true;
  465. reslut.ResultModel = mod;
  466. reslut.Message = "查询成功耗时:" + sw.ElapsedMilliseconds;
  467. }
  468. else
  469. {
  470. reslut.Message = "数据库中没有您要查询的数据";
  471. }
  472. reslut.StrSql = this.ToString();
  473. reslut.DBConfig = this.GetDataConnection();
  474. return reslut;
  475. }
  476. /// <summary>
  477. /// 获取列表
  478. /// </summary>
  479. /// <returns></returns>
  480. public ResponseModel ToList()
  481. {
  482. ResponseModel reslut = new ResponseModel();
  483. if (db.IsNull() || db.IsUnEnable)
  484. {
  485. db = DbContext.db;
  486. }
  487. if (db.IsNull() || db.IsUnEnable)
  488. {
  489. reslut.IsSuccess = false;
  490. reslut.Message = "连接数据库配置不能为空";
  491. return reslut;
  492. }
  493. this._dbContext.DbContextServiceProvider = DbContext.CreateDataAccess(db);
  494. //IEnumerable<T> iterator = this.GenerateIterator();//原始写法
  495. InternalQuery<T> iterator = this.GenerateIterator();
  496. reslut.StrSql = iterator.ToString();
  497. reslut.DBConfig = iterator.GetDataConnection();
  498. var modlist = iterator.ToList();
  499. if (modlist != null)
  500. {
  501. if (modlist.Count > 0)
  502. {
  503. reslut.ResultModel = modlist;
  504. reslut.RecordNum = modlist.Count;
  505. reslut.IsSuccess = true;
  506. sw.Stop();
  507. reslut.Message = string.Format("查询成功记录条数:{0}耗时:{1}", modlist.Count(), sw.ElapsedMilliseconds);
  508. }
  509. else
  510. {
  511. reslut.Message = "数据库中没有您要查询的数据";
  512. }
  513. }
  514. else
  515. {
  516. reslut.Message = "数据库中没有您要查询的数据";
  517. }
  518. return reslut;
  519. }
  520. /// <summary>
  521. ///
  522. /// </summary>
  523. /// <param name="request"></param>
  524. /// <returns></returns>
  525. public ResponseModel ToList(RequestModel request)
  526. {
  527. ResponseModel reslut = new ResponseModel();
  528. try
  529. {
  530. if (db.IsNull() || db.IsUnEnable)
  531. db = DbContext.db;
  532. if (db.IsNull() || db.IsUnEnable)
  533. db = request.db;
  534. this._dbContext.DbContextServiceProvider = DbContext.CreateDataAccess(db);
  535. InternalQuery<T> iterator = this.GenerateIterator();
  536. if (db.IsNull() || db.IsUnEnable)
  537. {
  538. reslut.IsSuccess = false;
  539. reslut.Message = "连接数据库配置不能为空";
  540. return reslut;
  541. }
  542. var modlist = iterator.ToList();
  543. reslut.ResultModel = modlist;
  544. reslut.RecordNum = modlist.Count;
  545. sw.Stop();
  546. if (modlist != null)
  547. {
  548. if (modlist.Count > 0)
  549. {
  550. reslut.IsSuccess = true;
  551. reslut.Message = string.Format("查询成功记录条数:{0}耗时:{1}", modlist.Count(), sw.ElapsedMilliseconds);
  552. }
  553. else
  554. {
  555. reslut.Message = "数据库中没有您要查询的数据";
  556. }
  557. }
  558. else
  559. {
  560. reslut.Message = "数据库中没有您要查询的数据";
  561. }
  562. reslut.StrSql = iterator.ToString();
  563. reslut.DBConfig = iterator.GetDataConnection();
  564. }
  565. catch(Exception ex)
  566. {
  567. }
  568. return reslut;
  569. }
  570. #endregion
  571. /// <summary>
  572. /// 是否存在这条记录
  573. /// </summary>
  574. /// <returns></returns>
  575. public ResponseModel Any()
  576. {
  577. ResponseModel reslut = new ResponseModel();
  578. var q = (Queryable<string>)this.Select(a => "1").Top(1);
  579. if (q.db.IsNull() || q.db.IsUnEnable)
  580. q.db = DbContext.db;
  581. reslut.IsSuccess = q.GenerateIterator().Any();
  582. return reslut;
  583. }
  584. /// <summary>
  585. /// 确定序列中是否有元素满足条件
  586. /// </summary>
  587. /// <param name="predicate"></param>
  588. /// <returns></returns>
  589. public ResponseModel Any(Expression<Func<T, bool>> predicate)
  590. {
  591. ResponseModel reslut = new ResponseModel();
  592. var q = this.Where(predicate);
  593. reslut.IsSuccess = q.Any().IsSuccess;
  594. return reslut;
  595. }
  596. /// <summary>
  597. /// 查询记录数
  598. /// </summary>
  599. /// <returns></returns>
  600. public int Count()
  601. {
  602. var getmethod = GetCalledMethod(() => default(IQuery<T>).Count());
  603. var reslut = this.ExecuteAggregateQuery<int>(getmethod, null, null, false).Item1;
  604. return reslut;
  605. }
  606. public ResponseModel Count(RequestModel request)
  607. {
  608. var num = this.ExecuteAggregateQuery<int>(GetCalledMethod(() => default(IQuery<T>).Count()), null, request, false).Item2;
  609. return num;
  610. }
  611. /// <summary>
  612. ///
  613. /// </summary>
  614. /// <returns></returns>
  615. public ResponseModel LongCount()
  616. {
  617. return this.ExecuteAggregateQuery<long>(GetCalledMethod(() => default(IQuery<T>).LongCount()), null, null, false).Item2;
  618. }
  619. /// <summary>
  620. /// 最大记录
  621. /// </summary>
  622. /// <typeparam name="TResult"></typeparam>
  623. /// <param name="selector"></param>
  624. /// <returns></returns>
  625. public TResult Max<TResult>(Expression<Func<T, TResult>> selector)
  626. {
  627. return ExecuteAggregateQuery<TResult>(GetCalledMethod(() => default(IQuery<T>).Max(default(Expression<Func<T, TResult>>))), selector).Item1;
  628. }
  629. /// <summary>
  630. /// 最小记录
  631. /// </summary>
  632. /// <typeparam name="TResult"></typeparam>
  633. /// <param name="selector"></param>
  634. /// <returns></returns>
  635. public TResult Min<TResult>(Expression<Func<T, TResult>> selector)
  636. {
  637. return ExecuteAggregateQuery<TResult>(GetCalledMethod(() => default(IQuery<T>).Min(default(Expression<Func<T, TResult>>))), selector).Item1;
  638. }
  639. #region Sum
  640. /// <summary>
  641. ///
  642. /// </summary>
  643. /// <param name="selector"></param>
  644. /// <returns></returns>
  645. public Tuple<int, ResponseModel> Sum(Expression<Func<T, int>> selector, RequestModel request = null)
  646. {
  647. var reslut = this.ExecuteAggregateQuery<int>(GetCalledMethod(() => default(IQuery<T>).Sum(default(Expression<Func<T, int>>), request)), selector, request);
  648. return reslut;
  649. }
  650. public Tuple<int?, ResponseModel> Sum(Expression<Func<T, int?>> selector, RequestModel request = null)
  651. {
  652. var reslut = this.ExecuteAggregateQuery<int?>(GetCalledMethod(() => default(IQuery<T>).Sum(default(Expression<Func<T, int?>>), request)), selector, request);
  653. return reslut;
  654. }
  655. public Tuple<long, ResponseModel> Sum(Expression<Func<T, long>> selector, RequestModel request = null)
  656. {
  657. var reslut = ExecuteAggregateQuery<long>(GetCalledMethod(() => default(IQuery<T>).Sum(default(Expression<Func<T, long>>), request)), selector, request);
  658. return reslut;
  659. }
  660. public Tuple<long?, ResponseModel> Sum(Expression<Func<T, long?>> selector, RequestModel request = null)
  661. {
  662. var reslut = ExecuteAggregateQuery<long?>(GetCalledMethod(() => default(IQuery<T>).Sum(default(Expression<Func<T, long?>>), request)), selector, request);
  663. return reslut;
  664. }
  665. public Tuple<decimal, ResponseModel> Sum(Expression<Func<T, decimal>> selector, RequestModel request = null)
  666. {
  667. var reslut = ExecuteAggregateQuery<decimal>(GetCalledMethod(() => default(IQuery<T>).Sum(default(Expression<Func<T, decimal>>), request)), selector, request);
  668. return reslut;
  669. }
  670. public Tuple<decimal?, ResponseModel> Sum(Expression<Func<T, decimal?>> selector, RequestModel request = null)
  671. {
  672. var reslut = ExecuteAggregateQuery<decimal?>(GetCalledMethod(() => default(IQuery<T>).Sum(default(Expression<Func<T, decimal?>>), request)), selector, request);
  673. return reslut;
  674. }
  675. public Tuple<double, ResponseModel> Sum(Expression<Func<T, double>> selector, RequestModel request = null)
  676. {
  677. var reslut = ExecuteAggregateQuery<double>(GetCalledMethod(() => default(IQuery<T>).Sum(default(Expression<Func<T, double>>), request)), selector, request);
  678. return reslut;
  679. }
  680. public Tuple<double?, ResponseModel> Sum(Expression<Func<T, double?>> selector, RequestModel request = null)
  681. {
  682. var reslut = ExecuteAggregateQuery<double?>(GetCalledMethod(() => default(IQuery<T>).Sum(default(Expression<Func<T, double?>>), request)), selector, request);
  683. return reslut;
  684. }
  685. public Tuple<float, ResponseModel> Sum(Expression<Func<T, float>> selector, RequestModel request = null)
  686. {
  687. var reslut = ExecuteAggregateQuery<float>(GetCalledMethod(() => default(IQuery<T>).Sum(default(Expression<Func<T, float>>), request)), selector, request);
  688. return reslut;
  689. }
  690. public Tuple<float?, ResponseModel> Sum(Expression<Func<T, float?>> selector, RequestModel request = null)
  691. {
  692. var reslut = ExecuteAggregateQuery<float?>(GetCalledMethod(() => default(IQuery<T>).Sum(default(Expression<Func<T, float?>>), request)), selector, request);
  693. return reslut;
  694. }
  695. #endregion
  696. #region Average
  697. public Tuple<int, ResponseModel> Average(Expression<Func<T, int>> selector, RequestModel request = null)
  698. {
  699. var reslut = ExecuteAggregateQuery<int>(GetCalledMethod(() => default(IQuery<T>).Sum(default(Expression<Func<T, int>>), request)), selector, request);
  700. return reslut;
  701. }
  702. public Tuple<int?, ResponseModel> Average(Expression<Func<T, int?>> selector, RequestModel request = null)
  703. {
  704. var reslut = ExecuteAggregateQuery<int?>(GetCalledMethod(() => default(IQuery<T>).Sum(default(Expression<Func<T, int?>>), request)), selector, request);
  705. return reslut;
  706. }
  707. public Tuple<long, ResponseModel> Average(Expression<Func<T, long>> selector, RequestModel request = null)
  708. {
  709. var reslut = ExecuteAggregateQuery<long>(GetCalledMethod(() => default(IQuery<T>).Sum(default(Expression<Func<T, long>>), request)), selector, request);
  710. return reslut;
  711. }
  712. public Tuple<long?, ResponseModel> Average(Expression<Func<T, long?>> selector, RequestModel request = null)
  713. {
  714. var reslut = ExecuteAggregateQuery<long?>(GetCalledMethod(() => default(IQuery<T>).Sum(default(Expression<Func<T, long?>>), request)), selector, request);
  715. return reslut;
  716. }
  717. public Tuple<decimal, ResponseModel> Average(Expression<Func<T, decimal>> selector, RequestModel request = null)
  718. {
  719. var reslut = ExecuteAggregateQuery<decimal>(GetCalledMethod(() => default(IQuery<T>).Sum(default(Expression<Func<T, decimal>>), request)), selector, request);
  720. return reslut;
  721. }
  722. public Tuple<decimal?, ResponseModel> Average(Expression<Func<T, decimal?>> selector, RequestModel request = null)
  723. {
  724. var reslut = ExecuteAggregateQuery<decimal?>(GetCalledMethod(() => default(IQuery<T>).Sum(default(Expression<Func<T, decimal?>>), request)), selector, request);
  725. return reslut;
  726. }
  727. public Tuple<double, ResponseModel> Average(Expression<Func<T, double>> selector, RequestModel request = null)
  728. {
  729. var reslut = ExecuteAggregateQuery<double>(GetCalledMethod(() => default(IQuery<T>).Sum(default(Expression<Func<T, double>>), request)), selector, request);
  730. return reslut;
  731. }
  732. public Tuple<double?, ResponseModel> Average(Expression<Func<T, double?>> selector, RequestModel request = null)
  733. {
  734. var reslut = ExecuteAggregateQuery<double?>(GetCalledMethod(() => default(IQuery<T>).Sum(default(Expression<Func<T, double?>>), request)), selector, request);
  735. return reslut;
  736. }
  737. public Tuple<float, ResponseModel> Average(Expression<Func<T, float>> selector, RequestModel request = null)
  738. {
  739. var reslut = ExecuteAggregateQuery<float>(GetCalledMethod(() => default(IQuery<T>).Sum(default(Expression<Func<T, float>>), request)), selector, request);
  740. return reslut;
  741. }
  742. public Tuple<float?, ResponseModel> Average(Expression<Func<T, float?>> selector, RequestModel request = null)
  743. {
  744. var reslut = ExecuteAggregateQuery<float?>(GetCalledMethod(() => default(IQuery<T>).Sum(default(Expression<Func<T, float?>>), request)), selector, request);
  745. return reslut;
  746. }
  747. #endregion
  748. public override QueryExpression QueryExpression { get { return this._expression; } }
  749. public override bool TrackEntity { get { return this._trackEntity; } }
  750. public IQuery<T> AsTracking()
  751. {
  752. return new Queryable<T>(this._dbContext, this.QueryExpression, true);
  753. }
  754. public IEnumerable<T> AsEnumerable()
  755. {
  756. return this.GenerateIterator();
  757. }
  758. /// <summary>
  759. ///
  760. /// </summary>
  761. /// <returns></returns>
  762. InternalQuery<T> GenerateIterator()
  763. {
  764. InternalQuery<T> internalQuery = new InternalQuery<T>(this);
  765. return internalQuery;
  766. }
  767. /// <summary>
  768. ///
  769. /// </summary>
  770. /// <typeparam name="TResult"></typeparam>
  771. /// <param name="method"></param>
  772. /// <param name="parameter"></param>
  773. /// <param name="request"></param>
  774. /// <param name="checkParameter"></param>
  775. /// <returns></returns>
  776. Tuple<TResult, ResponseModel> ExecuteAggregateQuery<TResult>(MethodInfo method, Expression parameter, RequestModel request = null, bool checkParameter = true)
  777. {
  778. ResponseModel reslut = new ResponseModel();
  779. if (checkParameter)
  780. AntUtils.CheckNull(parameter);
  781. if (db.IsNull() || db.IsUnEnable)
  782. db = DbContext.db;
  783. if (db.IsNull() || db.IsUnEnable)
  784. db = request.db;
  785. this._dbContext.DbContextServiceProvider = DbContext.CreateDataAccess(db);
  786. List<Expression> parameters = parameter == null ? EmptyParameterList : new List<Expression>(1) { parameter };
  787. AggregateQueryExpression e = new AggregateQueryExpression(this._expression, method, parameters);
  788. var q = new Queryable<TResult>(this._dbContext, e, false);
  789. if (q.db.IsNull() || q.db.IsUnEnable)
  790. {
  791. q.db = db;
  792. }
  793. if (q.db.IsNull() || q.db.IsUnEnable)
  794. {
  795. reslut.IsSuccess = false;
  796. reslut.Message = "连接数据库配置不能为空";
  797. TResult obj = Activator.CreateInstance<TResult>();
  798. Tuple<TResult, ResponseModel> resluterro = new Tuple<TResult, ResponseModel>(obj, reslut);
  799. return resluterro;
  800. }
  801. IEnumerable<TResult> iterator = this.CreateAggregateQuery<TResult>(q);
  802. reslut.IsSuccess = true;
  803. reslut.ResultModel = iterator.Single();
  804. Tuple<TResult, ResponseModel> resluts = new Tuple<TResult, ResponseModel>(iterator.Single(), reslut);
  805. return resluts;
  806. }
  807. /// <summary>
  808. ///
  809. /// </summary>
  810. /// <typeparam name="TResult"></typeparam>
  811. /// <param name="q"></param>
  812. /// <returns></returns>
  813. InternalQuery<TResult> CreateAggregateQuery<TResult>(Queryable<TResult> q)
  814. {
  815. InternalQuery<TResult> iterator = q.GenerateIterator();
  816. return iterator;
  817. }
  818. /// <summary>
  819. ///
  820. /// </summary>
  821. /// <typeparam name="TResult"></typeparam>
  822. /// <param name="exp"></param>
  823. /// <returns></returns>
  824. MethodInfo GetCalledMethod<TResult>(Expression<Func<TResult>> exp)
  825. {
  826. var body = (MethodCallExpression)exp.Body;
  827. return body.Method;
  828. }
  829. /// <summary>
  830. /// 获取SQL语句
  831. /// </summary>
  832. /// <returns></returns>
  833. public override string ToString()
  834. {
  835. InternalQuery<T> internalQuery = this.GenerateIterator();
  836. return internalQuery.ToString();
  837. }
  838. /// <summary>
  839. /// 获取数据库连接
  840. /// </summary>
  841. /// <returns></returns>
  842. public string GetDataConnection()
  843. {
  844. InternalQuery<T> internalQuery = this.GenerateIterator();
  845. return internalQuery.GetDataConnection();
  846. }
  847. }
  848. }