用于查询Web服务/方法的Lambda表达式?

时间:2012-06-27 14:21:30

标签: c# asp.net web-services lambda

我有一个Web服务,只需通过名为GetAll()的方法返回大量数据。

现在如果我不想要所有数据怎么办?如果我只想要一些基于查询或某些标准的实体,该怎么办?发送所有实体/对象然后处理消费者方面的“查询”感觉有点愚蠢。这是浪费带宽而且浪费时间,因为查询数据库查询所有对象/实体的查询需要很长时间。

是否有可能以某种方式发送lambda表达式或某事作为参数,然后让服务根据该表达式查询数据库,然后将所有对象的列表返回给使用者?

4 个答案:

答案 0 :(得分:1)

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

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

如果您将数据作为IQueryable<T>返回,那么您基本上可以将过滤器传递到URL中以返回所需的数据。

答案 1 :(得分:0)

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

  

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

答案 2 :(得分:0)

AFAIK - lambda不可序列化,因此不能通过线路发送。

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

  

GetAll(int start,int skip)

答案 3 :(得分:0)

不,您不能在WCF方法中传递lambdas或委托。 有关详细信息,请参阅this topic

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

  1. 为过滤器参数创建单独的类并将实例传递给服务器。在服务器端,您需要基于传递的对象形成查询。
  2. 使用Dictionary<string,string>作为过滤器参数的容器。在这种情况下,在服务器端,如果您有枚举,guid等,则需要解析值。如果我们有多个filter参数值,它也有限制。但是不需要创建一个单独的类。