ASP.NETWebApi实现数据的分页

ASP.NETWebApi实现数据的分页
前⾔
这篇⽂章我们将使⽤不同的⽅式实现⼿动分页(关于⾼端⼤⽓上档次的OData本⽂暂不涉及,但有可能会在系列的后期介绍,还没确定。。。),对于分页的结果,我们将采⽤2种不同的⽅式响应客户端(1.将分页元数据封装在响应Body中2.在http响应报⽂头部添加分页信息)。
众所周知,在服务器端⼀次性返回成百上千条数据是⾮常恐怖的,在我们设计Api的时候,对于Get⽅法我们应该以分页的⽅式返回。例如:每次响应给客户端10条数据,并且包含“上⼀页”和“下⼀页”的标签,这样⽤户就能去获得他想要的数据。
Way1.封装分页元数据封装在响应Body中
修改“CoursesController”的Get⽅法实现分页⽽不是⼀次性把所有数据返回,下⾯上代码:
public Object Get(int page = 0, int pageSize = 10)
{
IQueryable<Course> query;
query = TheRepository.GetAllCourses().OrderBy(c => c.CourseSubject.Id);
var totalCount = query.Count();
var totalPages = (int)Math.Ceiling((double)totalCount / pageSize);
var urlHelper = new UrlHelper(Request);
var prevLink = page > 0 ? urlHelper.Link("Courses", new { page = page - 1 }) : "";
var nextLink = page < totalPages - 1 ? urlHelper.Link("Courses", new { page = page + 1 }) : "";
var results = query
.Skip(pageSize * page)
.Take(pageSize)
kuli.ToList()
.Select(s => TheModelFactory.Create(s));
return new
{
TotalCount = totalCount,
TotalPages = totalPages,
PrevPageLink = prevLink,
NextPageLink = nextLink,
月朗星稀夜Results = results
};
}
解释⼀下上⾯的代码:
客户端收到的部分响应就应该是:
{
"totalCount": 32,
"totalPages": 4,
"prevPageLink": "localhost:3300/api/courses?page=0&pageSize=10",
"nextPageLink": "localhost:3300/api/courses?page=2&pageSize=10",
cneep
"results": [
{
"id": 11,
"url": "localhost:3300/api/courses/11",
"name": "English Education 2",
"duration": 4,
南昌工程学院学报"description": "The course will talk in depth about: English Education 2",
"tutor": {
"id": 4,
"email": "Kareem.Ismail@outlook",
"userName": "KareemIsmail",城市信报
"firstName": "Kareem",
"lastName": "Ismail",
"gender": 0
},
"subject": {
"id": 4,
"name": "English"
}
},
Repository中GetAllCourses的返回值为IQueryable,因此在执⾏skip和take⽅法时并没有到SQL Server中执⾏SQL语句,最后查询的也是分页好的数据,体现出按需查询的特⾊。
在我们返回给客户端的数据中,其中分页元数据中包含了totalCount, totalPages, prevPageLink, nextPageLink这些数据,对于客户端来说我们返回totalCount, totalPages这两条数据⾮常有⽤,这样就可以与⼀些Grid配合使⽤来绑定结果。
通常来说我们会将分页元数据封装在响应Body中,对于开发者来说我们提供了所有分页信息。但有的API消费者因此只想获取它请求的数据⽽不需要分页元数据,那么他在解析响应结果是就会很费劲,因此这⾥出现了另⼀种⽅式来向客户端响应分页元数据——在响应报⽂头部附加分页元数据:Body部分只包含请求的资源,我们新增⼀个头部信息“X-Pagination”。
Way2.封装分页元数据到响应Header中
我们修改StudentsController来实现将分页元数据封装在Header中,使⽤这种⽅法后,需要分页元数据的客户端直接从Header部分获取,不需要的客户端直接解析响应的Body即可。
实现起来也⾮常简单,下⾯上代码:
public IEnumerable<StudentBaseModel> Get(int page = 0, int pageSize = 10)
{
IQueryable<Student> query;
query = TheRepository.GetAllStudentsWithEnrollments().OrderBy(c => c.LastName);
var totalCount = query.Count();
var totalPages = (int)Math.Ceiling((double)totalCount / pageSize);
var urlHelper = new UrlHelper(Request);
var prevLink = page > 0 ? urlHelper.Link("Students", new { page = page - 1, pageSize = pageSize }) : "";
var nextLink = page < totalPages - 1 ? urlHelper.Link("Students", new { page = page + 1, pageSize = pageSize }) : "";
var paginationHeader = new
{
TotalCount = totalCount,
TotalPages = totalPages,
PrevPageLink = prevLink,
NextPageLink = nextLink
};
System.Web.HttpContext.Current.Response.Headers.Add("X-Pagination",
Newtonsoft.Json.JsonConvert.SerializeObject(paginationHeader));
var results = query
遵义铁通.Skip(pageSize * page)
.Take(pageSize)
.ToList()
.Select(s => TheModelFactory.CreateSummary(s));
return results;
}
这⾥我们添加了⼀个Header,⾥⾯包含⼀个Json序列化的分页元数据,客户端收到的响应:
总结
2种分页技术各有优劣,感觉碰到具体应⽤的时候再做选择了

本文发布于:2024-09-22 11:40:05,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/137478.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   响应   客户端   部分   时候   封装   头部
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议