在WCF数据服务的新版本中,获得了服务器端分页的功能。这项功能可以显著提高数据服务的性能,尤其是在处理大量数据时。本文将探讨如何在WCF数据服务中实现服务器端分页,并展示如何配置服务以返回数据的特定部分。
从WCF数据服务的早期开始,就可以通过使用$top和$skip查询参数在客户端实现分页。例如,以下URI用于数据服务,将返回请求的第11-20个课程:
http://localhost:8322/SchoolDataService.svc/Courses?$skip=10⊤=10
然而,当公开包含大量项目的资源时,问题就开始出现了。假设课程库中有10000个课程。以下URI将把所有的课程都带到客户端:
http://localhost:8322/SchoolDataService.svc/Courses
运行这个请求会大大减少服务的客户端数量,因为查询返回需要很长时间。那么,能做什么呢?使用服务器端分页。
如何限制返回给客户端的结果集呢?可以利用WCF数据服务的新特性。为了创建服务器端分页行为,所要做的就是配置服务以返回数据的一部分。将使用DataServiceConfiguration类中的一个新方法,这个方法叫做SetEntitySetPageSize,它可以为每个实体集设置分页大小,或者一次性为所有实体集设置(使用*)。以下代码为数据服务公开的所有实体集创建服务器端分页,每次只返回10个项目:
public class SchoolDataService : DataService<SchoolEntities>
{
public static void InitializeService(DataServiceConfiguration config)
{
config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
config.SetEntitySetPageSize("*", 10);
config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
}
}
现在,当使用服务的URI检索所有课程时,只能得到前十个课程。此外,正如看到的,在底部得到了一个链接,它引导到下一个十个结果:
http://localhost:8322/SchoolDataService.svc/Courses?$skiptoken=4041
在WCF数据服务的新版本中,获得了一个新的分页特性,它使得服务器端分页成为可能。使用这种方法或者将其与客户端分页结合起来,可以扩展WCF数据服务的能力。使用服务器端分页非常简单——只需配置服务。在本文中,展示了如何实现这种行为。
以下是实现服务器端分页的代码示例:
public class SchoolDataService : DataService<SchoolEntities>
{
public static void InitializeService(DataServiceConfiguration config)
{
config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
config.SetEntitySetPageSize("*", 10);
config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
}
}