[翻訳]ASPを作成する.NET WebApi RESTfulサービス(7)

7769 ワード

リソースページングの実装


この章では、いくつかの異なる結果セットのページング方式を紹介し、手動でページングを実現し、その後、Responseを2つの異なる方法でフォーマットします(ResponseのEnvelopメタデータまたはheader).
一度に何百ものデータを返すのは嫌なことだということはよく知られていますが、WebApiでページを分ける必要があります.

手動ページングとパッケージング


次に、CoursesControllerを変更して、すべてのデータを返すのではなく、ページングを実現します.
 
   1:  public Object Get(int page = 0, int pageSize = 10)
   2:      {
   3:          IQueryable<Course> query;
   4:   
   5:          query = TheRepository.GetAllCourses().OrderBy(c => c.CourseSubject.Id);
   6:          var totalCount = query.Count();
   7:          var totalPages = (int)Math.Ceiling((double)totalCount / pageSize);
   8:   
   9:          var urlHelper = new UrlHelper(Request);
  10:          var prevLink = page > 0 ? urlHelper.Link("Courses", new { page = page - 1 }) : "";
  11:          var nextLink = page < totalPages - 1 ? urlHelper.Link("Courses", new { page = page + 1 }) : "";
  12:   
  13:          var results = query
  14:          .Skip(pageSize * page)
  15:          .Take(pageSize)
  16:          .ToList()
  17:          .Select(s => TheModelFactory.Create(s));
  18:   
  19:          return new
  20:          {
  21:              TotalCount = totalCount,
  22:              TotalPages = totalPages,
  23:              PrevPageLink = prevLink,
  24:              NextPageLink = nextLink,
  25:              Results = results
  26:          };
  27:   
  28:      }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
コードは簡単で、2つのオプションパラメータを追加し、最終的にQueryStringにフォーマットされます.たとえば、http://localhost:{your_port}/api/courses/?page=1は、最初のページにアクセスする必要がある10のデータを表します.意外なことに、結果はこうかもしれません.
   1:  {
   2:   
   3:      "totalCount": 33,
   4:      "totalPages": 4,
   5:      "prevPageLink": "http://localhost:8323/api/courses?page=0&pageSize=10",
   6:      "nextPageLink": "http://localhost:8323/api/courses?page=2&pageSize=10",
   7:      "results": [ /* Array containts the results*/ ]
   8:   
   9:  }

その結果,jsonにデータをカプセル化してResponseの結果を返すことで,記録総数も返すことができる.1つの明らかな欠点は、このような類似データが我々の所望の結果セットを汚染する可能性があることであり、次にResponse HeaderにX−Paginationパラメータを追加することによってこの機能を実現する.
Response Headerによるページング

実装コードは次のとおりです。 1: public IEnumerable<StudentBaseModel> Get(int page = 0, int pageSize = 10) 2: { 3: IQueryable<Student> query; 4:   5: query = TheRepository.GetAllStudentsWithEnrollments().OrderBy(c => c.LastName); 6:   7: var totalCount = query.Count(); 8: var totalPages = (int)Math.Ceiling((double)totalCount / pageSize); 9:   10: var urlHelper = new UrlHelper(Request); 11: var prevLink = page > 0 ? urlHelper.Link("Students", new { page = page - 1, pageSize = pageSize }) : ""; 12: var nextLink = page < totalPages - 1 ? urlHelper.Link("Students", new { page = page + 1, pageSize = pageSize }) : ""; 13:   14: var paginationHeader = new 15: { 16: TotalCount = totalCount, 17: TotalPages = totalPages, 18: PrevPageLink = prevLink, 19: NextPageLink = nextLink 20: }; 21:   22: System.Web.HttpContext.Current.F.Add("X-Pagination", 23: Newtonsoft.Json.JsonConvert.SerializeObject(paginationHeader)); 24:   25: var results = query 26: .Skip(pageSize * page) 27: .Take(pageSize) 28: .ToList() 29: .Select(s => TheModelFactory.CreateSummary(s)); 30:   31: return results; 32: } .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } コードに注意してください。私たちはResponseにいます。Headersには、jsonでシーケンス化されたページングパラメータが追加されています。これにより結果を返すことができ、直接使用することができ、追加の情報を考慮することはできません。 ソース:http://bitoftech.net/2013/11/25/implement-resources-pagination-asp-net-web-api/