通过WebServices高效检索列表

时间:2011-01-04 15:51:27

标签: c# linq list pagination webservice-client

我有一个WCF WebService,它使用LINQ和EF连接到SQL数据库。我有一个ASP.NET MVC前端,它从Web服务中收集数据。

目前有

等功能
List<Customer> GetCustomers();

随着客户数量的大量增加,传递的数据量也会增加,从而降低效率。跨WebServices等“页面数据”的最佳方法是什么?

我目前的想法是实现粗略的分页系统,例如

List<Customer> GetCustomers(int start, int length);

然而,这意味着我必须为返回List类型的所有函数复制此类代码。不幸的是,我不能使用LINQ,因为它会更好。

有没有人对模式有任何建议或想法,以便“尽可能好”。另外,如何应对订购等事情。即如果我想通过一个特定的参数订购,我将不得不为每种类型定制一些看起来很浪费的东西。

由于

3 个答案:

答案 0 :(得分:1)

我之前没有使用过WCF,但以下情况应该有效:

  1. 定义包含起始和长度属性的DataContract类型。
  2. 将其声明为要在所有数据检索操作中使用的SOAP标头。
  3. 在接受SOAP Header对象的IEnumerable<T>上编写扩展方法。此方法将返回enumerable.Skip(start).Take(length)
  4. 在每个数据检索方法的返回中调用扩展方法。

答案 1 :(得分:1)

你需要复制的唯一代码是方法签名((int start, int length),以及对.Skip(start).Take(length)的调用。因为这些非常能表达你真正想要做的事情,我不会不要认为重复太多了。

您可能想要研究的另一件事是OData端点,它允许您通过URL在数据源的某个子集上构建一个查询,包括过滤器和分页。有关示例,请参阅:

答案 2 :(得分:0)

您可能对streaming WCF responses感兴趣(请参阅streaming的要求)。默认情况下,消息是缓冲的,但是流可以帮助减轻痛苦,并在获取数据时将数据推出。它很容易配置:

<basicHttpBinding>
    <binding name="StreamingBinding" 
        transferMode="StreamedRequest"  
        maxBufferSize="65536"
        maxReceivedMessageSize="204003200"  />
</basicHttpBinding>

<service behaviorConfiguration="behaviorConfig" name="serviceName">
    <endpoint address="http://whatever" 
        binding="basicHttpBinding" 
        bindingConfiguration="StreamingBinding" 
        contract="IServiceContract" />
</service>