【问题标题】:Lambda-expression for querying web service/method?用于查询 Web 服务/方法的 Lambda 表达式?
【发布时间】:2012-06-28 00:04:16
【问题描述】:

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

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

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

【问题讨论】:

  • 这取决于您的网络服务是如何构建的。如果您可以更改它或添加一个接受谓词的方法,那么很容易实现您想要的。 :)
  • 如果您愿意,您可以将加密的麦当劳菲力鱼三明治元组传递给您的网络服务。真正的问题是你的网络服务能处理它吗?
  • 这似乎适用于 ASP.NET Web API,它在客户端支持 OData 和 IQueryable。看这里:stackoverflow.com/questions/10422460/….
  • @Trustme-I'maDoctor 嗯,我对双方都有完全的控制权.. 我刚刚开始构建 web 服务 :).. 所以还没有真正构建任何东西

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


【解决方案1】:

这可能不是适合您的解决方案,具体取决于您的项目设置方式,但您可能希望了解 OData Web 服务。

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

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

【讨论】:

    【解决方案2】:

    不,您不能在 WCF 方法中传递 lambda 或委托。 更多详情见this topic

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

        GetAll(int start, int skip)

        【讨论】:

        • 好的,服务还没有建立 :).. 我需要一种方法来过滤查询结果,然后再将其发送到客户端.. 这就是 lambda 看起来不错的地方想法..如果它可以工作:(..还有其他建议吗?
        猜你喜欢
        • 1970-01-01
        • 2019-03-03
        • 1970-01-01
        • 1970-01-01
        • 2011-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多