0

我有一个 WCF 服务,它具有返回列表的函数,例如返回客户列表的函数

[OperationContract]
IList<Customer> GetCustomers();

我的 ASP.NET 页面可能会:

var top10Customers = Model.GetCustomers().Take(10);
var first10Customers = Model.OrderBy(c => c.ID).Take(10);

据我了解,以下代码将从 WCF 服务返回所有客户,然后应用OrderByTake(10)

一次返回整个数据集似乎效率低下,尤其是 WCF 服务可能驻留在与 ASP.NET 网站不同的机器上。在这种情况下,我怎样才能最好地分页结果集或允许对其进行 LINQ 操作?

我现在可以看到的唯一选项是向函数添加分页选项,但是一直重写这段代码似乎效率低下:

[OperationContract]
IList<Customer> GetCustomers(int from, int numResults);
4

3 回答 3

1

我建议将参数添加到 GetCustomers 方法中,然后在该端执行 LINQ 以生成最有效的 SQL?

[OperationContract] 
IList<Customer> GetCustomers(int fromRecoard, string orderBy); 

order by 将是一个小技巧,因为您需要将 sting 转换为 lamda 表达式并使用 Customer 的属性,但网络上有很多示例。

有关 .Net 4.5 中 IQueryable 的更多信息,请查看 OData 部分下的这篇博文。

http://www.davidhayden.me/blog/asp.net-mvc-4-web-api-routes-and-apicontroller

于 2012-04-12T16:06:34.700 回答
0
[OperationContract]
IList<Customer> GetCustomers(int from, int numResults);

什么更无效率?在几个地方更改您的代码,或者通过“网络”发送整个数据集以获得 10 行?

您最好的选择通常是在服务端应用分​​页,LINQ 可以对数据库执行最佳查询。即使服务 sid 上的分页没有那么优化,您仍然可以通过将少量数据传回给消费者来获得收益。

至于排序,我认为没有理由不能在客户端进行排序。事实上,我认为你应该这样做,以便消费者可以按照他们认为合适的方式进行分类。您不会从排序中获得或损失太多 - 相同数量的记录被传递,排序与否。

于 2012-04-12T14:35:46.473 回答
0

我建议将参数添加到 GetCustomers 方法中,然后在该端执行 LINQ 以生成最有效的 SQL?

于 2013-02-12T07:06:54.730 回答