SkipQueryState.cs 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. using Ant.DbExpressions;
  2. using Ant.Query.QueryExpressions;
  3. using System;
  4. namespace Ant.Query.QueryState
  5. {
  6. internal sealed class SkipQueryState : SubQueryState
  7. {
  8. int _count;
  9. public SkipQueryState(ResultElement resultElement, int count)
  10. : base(resultElement)
  11. {
  12. this.Count = count;
  13. }
  14. public int Count
  15. {
  16. get
  17. {
  18. return this._count;
  19. }
  20. set
  21. {
  22. this.CheckInputCount(value);
  23. this._count = value;
  24. }
  25. }
  26. void CheckInputCount(int count)
  27. {
  28. if (count < 0)
  29. {
  30. throw new ArgumentException("The skip count could not less than 0.");
  31. }
  32. }
  33. public override IQueryState Accept(SelectExpression exp)
  34. {
  35. ResultElement result = this.CreateNewResult(exp.Selector);
  36. return this.CreateQueryState(result);
  37. }
  38. public override IQueryState Accept(SkipExpression exp)
  39. {
  40. if (exp.Count < 1)
  41. {
  42. return this;
  43. }
  44. this.Count += this.Count;
  45. return this;
  46. }
  47. public override IQueryState Accept(TakeExpression exp)
  48. {
  49. var state = new LimitQueryState(this.Result, this.Count, exp.Count);
  50. return state;
  51. }
  52. public override IQueryState CreateQueryState(ResultElement result)
  53. {
  54. return new SkipQueryState(result, this.Count);
  55. }
  56. public override DbSqlQueryExpression CreateSqlQuery()
  57. {
  58. DbSqlQueryExpression sqlQuery = base.CreateSqlQuery();
  59. sqlQuery.TakeCount = null;
  60. sqlQuery.SkipCount = this.Count;
  61. return sqlQuery;
  62. }
  63. }
  64. }