0

我有一个 Web 服务,它只是通过一个名为GetAll().

现在,如果我不想要所有数据怎么办?如果我只想要基于查询或某些条件的几个实体怎么办。发送所有实体/对象然后在消费者端处理“查询”感觉有点傻。这是对带宽的浪费,也是对时间的浪费,因为查询数据库中所有对象/实体的查询需要相当长的时间。

是否有可能以某种方式发送一个 lambda 表达式或其他东西作为参数,然后让服务根据该表达式查询数据库,然后将所有对象的列表返回给消费者?

4

4 回答 4

1

根据您的项目设置方式,它可能不是您的解决方案,但您可能希望查看 OData Web 服务。

http://www.dotnetexpertguide.com/2012/03/odata-service-with-asp-net-web-api.html

如果您将数据返回为IQueryable<T>Then 您基本上可以将过滤器传递到 URL 以返回您需要的数据。

于 2012-06-27T14:28:41.893 回答
0

这样做可能不是一个好主意。最好提供客户端需要的方法,如果需要,客户端可以进一步过滤。但是,我不是一个判断你的问题的人,所以,引用这篇文章

充其量你可以让它接受一个表达式的序列化版本,但不是一个 lambda,lambda 是一个方法指针,一个表达式是可以编译、分析等的东西的表示。

于 2012-06-27T14:25:58.040 回答
0

AFAIK - lambda 不会可序列化,因此无法通过网络发送。

但是,您的问题暗示了一些非常糟糕的设计决策,例如不受限制的结果集非常糟糕。您应该考虑使用过滤器对象或其他东西向查询添加谓词。至少你应该考虑做类似的事情:

GetAll(int 开始,int 跳过)

于 2012-06-27T14:27:38.427 回答
0

不,您不能在 WCF 方法中传递 lambda 或委托。有关更多详细信息,请参阅此主题

当我遇到您的任务时,我使用了其中一种方法

  1. 为过滤器参数创建一个单独的类并将一个实例传递给服务器。在服务器端,您需要根据传递的对象形成查询。
  2. 使用 aDictionary<string,string>作为过滤器参数的容器。在这种情况下,在服务器端,如果您有枚举、guid 等,则需要解析值。如果我们有多个过滤器参数值,它也会受到限制。但无需创建单独的类。
于 2012-06-27T14:59:47.417 回答