【问题标题】:Implementing pager through WCF service通过 WCF 服务实现寻呼机
【发布时间】:2010-10-18 23:46:54
【问题描述】:

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

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

  1. 我的控制器可以获取整个产品列表,并且只进行内存分页
  2. WCF 可以选择所有产品并将它们存储在其缓存中的某个位置,然后根据请求的页码仅将其中的一部分传递给控制器​​。
  3. WCF 只能根据请求的页码从数据库中选择部分产品。
  4. WCF 可以将 IQueryable 返回给控制器,然后控制器会随时选择他想要的任何内容。

据我了解(如果不正确,请纠正我),第一个选项没有用,所以我必须在其他选项中进行选择。

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

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

第四个选项听起来令人困惑。我实际上将某种查询传递给客户端,然后他自己通过 WCF 服务查询我的数据库。我不知道如何正确实施。

那么您能帮我选择正确的实现方式吗?

【问题讨论】:

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


    【解决方案1】:

    您的后端数据库层是什么样的?如果您使用 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();
      }
    }
    

    这对你有帮助吗?

    马克

    【讨论】:

    • 是的,我正在使用 LINQ-to-SQL。所以你提供的实际上是我的第三个选择。好吧,我可能会去。当 WCF 服务将 IQueryable 传递给客户端而不实际从数据库中选择任何内容时,我想到了某种延迟执行。但我不知道该怎么做
    • 好吧,就目前而言,我认为传递 IQueryable 可能有点困难。但是,如果您查看有关“RIA 服务”的 MIX'09 视频——这正是 MS 现在为 Silverlight 3 构建的内容——这可能会解决您的所有问题 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多