通过WCF服务实现寻呼机

时间:2009-04-12 07:40:13

标签: asp.net-mvc wcf web-services

我正在开发一个包含WCF服务及其ASP.NET MVC客户端的应用程序。 ASP.NET MVC网站必须显示一个对象网格 - 比如产品。这些产品存储在可通过WCF服务访问的数据库中。所以在MVC控制器内的某个地方,我调用WCF服务的方法,它返回一个我需要显示的产品数组。

那么我的问题是什么?我想为我的产品网格实现一个寻呼机功能,因为可能会有很多产品。所以有几种方法可以做到这一点:

  1. 我的控制器可以获取整个产品列表,只需进行内存中分页
  2. WCF可以选择所有产品并将其存储在缓存中的某个位置,然后根据请求的页码将其中的一部分传递给控制器​​。
  3. 根据请求的页码,WCF只能从数据库中选择部分产品。
  4. WCF可以将IQueryable返回给控制器,然后控制器会随时选择他想要的任何内容。
  5. 据我了解(并纠正我,如果不是这样),第一个选项是无用的,所以我必须在其他选项之间做出选择。

    第二个选项会浪费我服务器的内存。

    第三个选项是OK,但在WCF端实现分页似乎有点难看。

    第四个选项听起来令人困惑。我实际上将一些查询传递给客户端,然后他通过WCF服务自己查询我的数据库。我无法弄清楚如何正确实现这一点。

    那么请你帮我选择正确的方法来实现这个目标吗?

1 个答案:

答案 0 :(得分:15)

您的后端数据库层是什么样的?如果您正在使用LINQ(-to-SQL或-to-Entities),您可以通过指定所需的页面大小和页码来实现WCF分页,然后使用LINQ的“Skip”和“Take”运算符来获取请求的页面 - 大致类似于:

[ServiceContract]
public interface IFetchData
{
  [OperationContract]
  public List<Data> GetData(int pageSize, int pageNumber)
}

然后实现类似这样的东西(简化):

public class FetchDataService : IFetchData
{
  public List<Data> GetData(int pageSize, int pageNumber)
  {
      var query = yourContext.DataTable
                    .Skip((pageNumber - 1) * pageSize)
                    .Take(pageSize);

      return query.ToList();
  }
}

这对你有帮助吗?

马克