PageRenderTime 45ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/YUI/YUI.Core/Dao/Query/MemoryQuery.cs

http://yuicore.googlecode.com/
C# | 579 lines | 323 code | 65 blank | 191 comment | 25 complexity | f690c79d3c262de86f0ca8e4dc8a18fb MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Data;
  5. using YUI.Core.Dao.Session;
  6. using YUI.Core.Dao.Expression;
  7. using YUI.Core.Dao.Source;
  8. using YUI.Core.Common;
  9. namespace YUI.Core.Dao.Query
  10. {
  11. public class MemoryQuery<T> : IMemoryQuery<T>
  12. {
  13. private DataTable dt;
  14. private string filter;
  15. private string sort;
  16. #region ???MemoryQuery
  17. /// <summary>
  18. /// ????DataTable
  19. /// </summary>
  20. /// <param name="page"></param>
  21. /// <param name="pageIndex"></param>
  22. internal MemoryQuery(DataTable dt)
  23. {
  24. this.dt = dt;
  25. }
  26. #endregion
  27. #region IMemoryQuery<T> ??
  28. /// <summary>
  29. /// ??????
  30. /// </summary>
  31. /// <param name="where"></param>
  32. /// <returns></returns>
  33. public MemoryQuery<T> Where(WhereClip where)
  34. {
  35. if (!DataUtils.IsNullOrEmpty(where))
  36. {
  37. string strWhere = where.ToString();
  38. foreach (SQLParameter p in where.Parameters)
  39. {
  40. strWhere = strWhere.Replace(p.Name, DataUtils.FormatValue(p.Value));
  41. }
  42. filter = DataUtils.RemoveTableAliasNamePrefixes(strWhere);
  43. }
  44. return this;
  45. }
  46. /// <summary>
  47. /// ??????
  48. /// </summary>
  49. /// <param name="where"></param>
  50. /// <returns></returns>
  51. public MemoryQuery<T> OrderBy(OrderByClip order)
  52. {
  53. if (!DataUtils.IsNullOrEmpty(order))
  54. {
  55. sort = DataUtils.RemoveTableAliasNamePrefixes(order.ToString());
  56. }
  57. return this;
  58. }
  59. /// <summary>
  60. /// ??????
  61. /// </summary>
  62. /// <param name="where"></param>
  63. /// <returns></returns>
  64. public T ToSingle()
  65. {
  66. DataTable dt = GetDataTable(this, 1, 0);
  67. IList<T> list = new SourceTable(dt).ConvertTo<T>();
  68. if (list.Count > 0)
  69. {
  70. return list[0];
  71. }
  72. return default(T);
  73. }
  74. /// <summary>
  75. /// ??IArrayList
  76. /// </summary>
  77. /// <returns></returns>
  78. public ISourceList<T> ToList()
  79. {
  80. return ToTable().ConvertTo<T>();
  81. }
  82. /// <summary>
  83. /// ??IArrayList
  84. /// </summary>
  85. /// <returns></returns>
  86. public ISourceList<T> ToList(int topSize)
  87. {
  88. return ToTable(topSize).ConvertTo<T>();
  89. }
  90. /// <summary>
  91. /// ??IArrayList
  92. /// </summary>
  93. /// <returns></returns>
  94. public ISourceList<T> ToList(int startIndex, int endIndex)
  95. {
  96. return ToTable(startIndex, endIndex).ConvertTo<T>();
  97. }
  98. /// <summary>
  99. /// ???????
  100. /// </summary>
  101. /// <param name="pkValues"></param>
  102. /// <returns></returns>
  103. public ISourceTable ToTable()
  104. {
  105. DataTable dt = GetDataTable(this);
  106. return new SourceTable(dt);
  107. }
  108. /// <summary>
  109. /// ???????
  110. /// </summary>
  111. /// <param name="where"></param>
  112. /// <returns></returns>
  113. public ISourceTable ToTable(int topSize)
  114. {
  115. DataTable dt = GetDataTable(this, topSize, 0);
  116. return new SourceTable(dt);
  117. }
  118. /// <summary>
  119. /// ???????
  120. /// </summary>
  121. /// <param name="where"></param>
  122. /// <returns></returns>
  123. public ISourceTable ToTable(int startIndex, int endIndex)
  124. {
  125. if (startIndex <= 0) startIndex = 1;
  126. int topItem = endIndex - startIndex + 1;
  127. DataTable dt = GetDataTable(this, topItem, endIndex - topItem);
  128. return new SourceTable(dt);
  129. }
  130. #region ????
  131. /// <summary>
  132. /// ?????
  133. /// </summary>
  134. /// <param name="where"></param>
  135. /// <returns></returns>
  136. public int Count(Field field)
  137. {
  138. try
  139. {
  140. if (filter == null)
  141. {
  142. return dt.Rows.Count;
  143. }
  144. object obj = FindScalar(field.Count());
  145. return DataUtils.ConvertValue<int>(obj);
  146. }
  147. catch
  148. {
  149. return 0;
  150. }
  151. }
  152. /// <summary>
  153. /// ?????
  154. /// </summary>
  155. /// <param name="field"></param>
  156. /// <param name="where"></param>
  157. /// <returns></returns>
  158. public object Avg(Field field)
  159. {
  160. return FindScalar(field.Avg());
  161. }
  162. /// <summary>
  163. /// ?????
  164. /// </summary>
  165. /// <param name="field"></param>
  166. /// <param name="where"></param>
  167. /// <returns></returns>
  168. public object Max(Field field)
  169. {
  170. return FindScalar(field.Max());
  171. }
  172. /// <summary>
  173. /// ?????
  174. /// </summary>
  175. /// <param name="field"></param>
  176. /// <param name="where"></param>
  177. /// <returns></returns>
  178. public object Min(Field field)
  179. {
  180. return FindScalar(field.Min());
  181. }
  182. /// <summary>
  183. /// ?????
  184. /// </summary>
  185. /// <param name="field"></param>
  186. /// <param name="where"></param>
  187. /// <returns></returns>
  188. public object Sum(Field field)
  189. {
  190. return FindScalar(field.Sum());
  191. }
  192. /// <summary>
  193. /// ?????
  194. /// </summary>
  195. /// <typeparam name="TResult"></typeparam>
  196. /// <param name="field"></param>
  197. /// <param name="where"></param>
  198. /// <returns></returns>
  199. public TResult Avg<TResult>(Field field)
  200. {
  201. object obj = Avg(field);
  202. return DataUtils.ConvertValue<TResult>(obj);
  203. }
  204. /// <summary>
  205. /// ?????
  206. /// </summary>
  207. /// <typeparam name="TResult"></typeparam>
  208. /// <param name="field"></param>
  209. /// <param name="where"></param>
  210. /// <returns></returns>
  211. public TResult Max<TResult>(Field field)
  212. {
  213. object obj = Max(field);
  214. return DataUtils.ConvertValue<TResult>(obj);
  215. }
  216. /// <summary>
  217. /// ?????
  218. /// </summary>
  219. /// <typeparam name="TResult"></typeparam>
  220. /// <param name="field"></param>
  221. /// <param name="where"></param>
  222. /// <returns></returns>
  223. public TResult Min<TResult>(Field field)
  224. {
  225. object obj = Min(field);
  226. return DataUtils.ConvertValue<TResult>(obj);
  227. }
  228. /// <summary>
  229. /// ?????
  230. /// </summary>
  231. /// <typeparam name="TResult"></typeparam>
  232. /// <param name="field"></param>
  233. /// <param name="where"></param>
  234. /// <returns></returns>
  235. public TResult Sum<TResult>(Field field)
  236. {
  237. object obj = Sum(field);
  238. return DataUtils.ConvertValue<TResult>(obj);
  239. }
  240. #endregion
  241. #region ??Object??
  242. /// <summary>
  243. /// ??object??
  244. /// </summary>
  245. /// <typeparam name="TResult"></typeparam>
  246. /// <param name="field"></param>
  247. /// <returns></returns>
  248. public IArrayList<object> ToListResult(Field field)
  249. {
  250. return GetListResult<object>(this, field);
  251. }
  252. /// <summary>
  253. /// ??object??
  254. /// </summary>
  255. /// <typeparam name="TResult"></typeparam>
  256. /// <param name="field"></param>
  257. /// <param name="where"></param>
  258. /// <returns></returns>
  259. public IArrayList<object> ToListResult(Field field, int topSize)
  260. {
  261. return GetListResult<object>(this, field, topSize, 0);
  262. }
  263. /// <summary>
  264. /// ??object??
  265. /// </summary>
  266. /// <typeparam name="TResult"></typeparam>
  267. /// <param name="field"></param>
  268. /// <param name="where"></param>
  269. /// <param name="order"></param>
  270. /// <returns></returns>
  271. public IArrayList<object> ToListResult(Field field, int startIndex, int endIndex)
  272. {
  273. if (startIndex <= 0) startIndex = 1;
  274. int topItem = endIndex - startIndex + 1;
  275. return GetListResult<object>(this, field, topItem, endIndex - topItem);
  276. }
  277. /// <summary>
  278. /// ??object??
  279. /// </summary>
  280. /// <typeparam name="TResult"></typeparam>
  281. /// <param name="field"></param>
  282. /// <returns></returns>
  283. public IArrayList<TResult> ToListResult<TResult>(Field field)
  284. {
  285. return GetListResult<TResult>(this, field);
  286. }
  287. /// <summary>
  288. /// ??object??
  289. /// </summary>
  290. /// <typeparam name="TResult"></typeparam>
  291. /// <param name="field"></param>
  292. /// <param name="where"></param>
  293. /// <returns></returns>
  294. public IArrayList<TResult> ToListResult<TResult>(Field field, int topSize)
  295. {
  296. return GetListResult<TResult>(this, field, topSize, 0);
  297. }
  298. /// <summary>
  299. /// ??object??
  300. /// </summary>
  301. /// <typeparam name="TResult"></typeparam>
  302. /// <param name="field"></param>
  303. /// <param name="where"></param>
  304. /// <param name="order"></param>
  305. /// <returns></returns>
  306. public IArrayList<TResult> ToListResult<TResult>(Field field, int startIndex, int endIndex)
  307. {
  308. if (startIndex <= 0) startIndex = 1;
  309. int topItem = endIndex - startIndex + 1;
  310. return GetListResult<TResult>(this, field, topItem, endIndex - topItem);
  311. }
  312. #endregion
  313. #region ????
  314. /// <summary>
  315. /// ???
  316. /// </summary>
  317. /// <param name="query"></param>
  318. /// <returns></returns>
  319. internal DataTable GetDataTable(MemoryQuery<T> query)
  320. {
  321. try
  322. {
  323. DataTable q_dt = query.dt;
  324. string q_filter = query.filter;
  325. string q_sort = query.sort;
  326. DataTable table = new DataTable();
  327. table.TableName = typeof(T).Name;
  328. foreach (DataColumn column in q_dt.Columns)
  329. {
  330. table.Columns.Add(column.ColumnName, column.DataType);
  331. }
  332. if (q_dt.Rows.Count == 0) return table;
  333. DataRow[] dtRows = q_dt.Select(q_filter, q_sort);
  334. foreach (DataRow row in dtRows)
  335. {
  336. table.ImportRow(row);
  337. }
  338. return table;
  339. }
  340. catch
  341. {
  342. throw;
  343. }
  344. }
  345. /// <summary>
  346. /// ???
  347. /// </summary>
  348. /// <param name="query"></param>
  349. /// <param name="itemCount"></param>
  350. /// <param name="skipCount"></param>
  351. /// <returns></returns>
  352. internal DataTable GetDataTable(MemoryQuery<T> query, int itemCount, int skipCount)
  353. {
  354. try
  355. {
  356. DataTable q_dt = query.dt;
  357. string q_filter = query.filter;
  358. string q_sort = query.sort;
  359. DataTable table = new DataTable();
  360. table.TableName = typeof(T).Name;
  361. foreach (DataColumn column in q_dt.Columns)
  362. {
  363. table.Columns.Add(column.ColumnName, column.DataType);
  364. }
  365. if (q_dt.Rows.Count == 0) return table;
  366. DataRow[] dtRows = q_dt.Select(q_filter, q_sort);
  367. int index = 0;
  368. foreach (DataRow row in dtRows)
  369. {
  370. if (index >= skipCount)
  371. {
  372. table.ImportRow(row);
  373. }
  374. index++;
  375. if (table.Rows.Count == itemCount) break;
  376. }
  377. return table;
  378. }
  379. catch
  380. {
  381. throw;
  382. }
  383. }
  384. /// <summary>
  385. /// ????
  386. /// </summary>
  387. /// <param name="where"></param>
  388. /// <param name="order"></param>
  389. private IArrayList<TResult> GetListResult<TResult>(MemoryQuery<T> query, Field field)
  390. {
  391. try
  392. {
  393. DataTable q_dt = query.dt;
  394. string q_filter = query.filter;
  395. string q_sort = query.sort;
  396. if (q_dt.Rows.Count == 0) return new ArrayList<TResult>();
  397. DataRow[] dtRows = q_dt.Select(q_filter, q_sort);
  398. IArrayList<TResult> list = new ArrayList<TResult>();
  399. foreach (DataRow row in dtRows)
  400. {
  401. list.Add(DataUtils.ConvertValue<TResult>(row[field.OriginalName]));
  402. }
  403. return list;
  404. }
  405. catch
  406. {
  407. throw;
  408. }
  409. }
  410. /// <summary>
  411. /// ????
  412. /// </summary>
  413. /// <param name="where"></param>
  414. /// <param name="order"></param>
  415. internal IArrayList<TResult> GetListResult<TResult>(MemoryQuery<T> query, Field field, int itemCount, int skipCount)
  416. {
  417. try
  418. {
  419. DataTable q_dt = query.dt;
  420. string q_filter = query.filter;
  421. string q_sort = query.sort;
  422. if (q_dt.Rows.Count == 0) return new ArrayList<TResult>();
  423. DataRow[] dtRows = q_dt.Select(q_filter, q_sort);
  424. IArrayList<TResult> list = new ArrayList<TResult>();
  425. int index = 0;
  426. foreach (DataRow row in dtRows)
  427. {
  428. if (index >= skipCount)
  429. {
  430. list.Add(DataUtils.ConvertValue<TResult>(row[field.OriginalName]));
  431. }
  432. index++;
  433. if (list.Count == itemCount) break;
  434. }
  435. return list;
  436. }
  437. catch
  438. {
  439. throw;
  440. }
  441. }
  442. /// <summary>
  443. /// ???????
  444. /// </summary>
  445. /// <param name="field"></param>
  446. /// <param name="where"></param>
  447. /// <returns></returns>
  448. private object FindScalar(Field field)
  449. {
  450. try
  451. {
  452. if (dt.Rows.Count == 0) return null;
  453. string column = DataUtils.RemoveTableAliasNamePrefixes(field.Name);
  454. if (column.Contains("distinct"))
  455. {
  456. DataView dv = new DataView(dt, filter, null, DataViewRowState.OriginalRows);
  457. column = new System.Text.RegularExpressions.Regex(@"\S+distinct\(([\w]+)\S+").Replace(column, "$1");
  458. return dv.ToTable(true, column).Rows.Count;
  459. }
  460. else
  461. {
  462. return dt.Compute(column, filter);
  463. }
  464. }
  465. catch
  466. {
  467. return null;
  468. }
  469. }
  470. #endregion
  471. /// <summary>
  472. /// ????MemoryQuery
  473. /// </summary>
  474. /// <param name="pageSize"></param>
  475. /// <returns></returns>
  476. public MemoryPage<T> GetPage(Field field, int pageSize)
  477. {
  478. return new MemoryPage<T>(this, field, pageSize);
  479. }
  480. #region ??????
  481. /// <summary>
  482. /// ????DataPage????
  483. /// </summary>
  484. /// <param name="pageSize"></param>
  485. /// <param name="pageNo"></param>
  486. /// <returns></returns>
  487. public IDataPage<IList<T>> ToListPage(Field field, int pageSize, int pageIndex)
  488. {
  489. IDataPage<IList<T>> view = new DataPage<IList<T>>(pageSize);
  490. MemoryPage<T> page = GetPage(field, pageSize);
  491. view.CurrentPageIndex = pageIndex;
  492. view.RowCount = page.RowCount;
  493. view.DataSource = page.ToList(pageIndex);
  494. return view;
  495. }
  496. /// <summary>
  497. /// ????DataPage????
  498. /// </summary>
  499. /// <param name="pageSize"></param>
  500. /// <param name="pageNo"></param>
  501. /// <returns></returns>
  502. public IDataPage<DataTable> ToTablePage(Field field, int pageSize, int pageIndex)
  503. {
  504. IDataPage<DataTable> view = new DataPage<DataTable>(pageSize);
  505. MemoryPage<T> page = GetPage(field, pageSize);
  506. view.CurrentPageIndex = pageIndex;
  507. view.RowCount = page.RowCount;
  508. view.DataSource = page.ToTable(pageIndex) as SourceTable;
  509. return view;
  510. }
  511. #endregion
  512. #endregion
  513. }
  514. }