我有一个Web服务,只需通过名为GetAll()
的方法返回大量数据。
现在如果我不想要所有数据怎么办?如果我只想要一些基于查询或某些标准的实体,该怎么办?发送所有实体/对象然后处理消费者方面的“查询”感觉有点愚蠢。这是浪费带宽而且浪费时间,因为查询数据库查询所有对象/实体的查询需要很长时间。
是否有可能以某种方式发送lambda表达式或某事作为参数,然后让服务根据该表达式查询数据库,然后将所有对象的列表返回给使用者?
答案 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
当我遇到你的任务时,我使用了其中一种方法
Dictionary<string,string>
作为过滤器参数的容器。在这种情况下,在服务器端,如果您有枚举,guid等,则需要解析值。如果我们有多个filter参数值,它也有限制。但是不需要创建一个单独的类。