【问题标题】:How does client filtering work for a WCF IQueryable method?客户端筛选如何为 WCF IQueryable 方法工作?
【发布时间】:2012-07-14 22:46:12
【问题描述】:

我是 WCF 的新手,我需要帮助来理解一些东西。

我创建了一个 WCF 数据服务,它返回由服务从实体映射的 DTO。在我的服务合同接口上,我有一些方法 GetMyDto 返回 IQueryable<MyDto>

我在 MVC 应用程序中添加了对此服务的服务引用。然后接口和代理客户端返回List<MyDto>(或者我可以选择其他几个集合类型)而不是IQueryable<MyDto>

我知道IQueryable 不能暴露给客户端,但如果我在客户端上过滤(即MyServiceClient.GetMyDto().Where(x => x.SomeValue == 1)),它会在客户端还是服务器上过滤?

我的理解是它可以使用 odata,但是我看到的所有示例都直接将实体模型暴露给客户端,我没有这样做。我正在使用 DTO。

我有什么限制?帮助我准确了解调用服务时发生的情况。

【问题讨论】:

    标签: wcf wcf-data-services odata iqueryable


    【解决方案1】:

    补充拉迪斯拉夫所说的(完全准确):

    如果您使用的是 DTO,则您处于反射提供者领域或自定义提供者领域。自定义提供程序允许极端自定义,但学习曲线相当大。 AlexJ 在这个主题上有一个出色的blog post series。反射提供者在这一点上有一些不幸的限制,但很难具体列举它们,所以最好只是尝试一下,看看你在哪里遇到了痛点。如果您没有达到这些限制,它会非常易于使用,并且可能会在帮助您构建服务方面做得很好。

    团队中的一些成员非常希望改进我们的提供商故事。我不能保证这将是我们在不久的将来工作的优先事项,但如果有一些小问题我们可以解决,我们很乐意听到。

    【讨论】:

      【解决方案2】:

      WCF 数据服务的重点是向客户端公开IQueryable。当您使用数据服务客户端时,您正在查询IQueryable。您的查询将转换为 OData 查询字符串(URL 的一部分)并传递给服务器执行。

      如果您需要客户端过滤,您首先必须使用类似 MyServiceClient.GetMyDto().ToList() 的方式将所有数据加载到客户端应用程序,然后您可以对列表执行 linq-to-objects 过滤。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-17
        • 1970-01-01
        • 2020-04-26
        • 1970-01-01
        • 2016-08-14
        • 1970-01-01
        • 1970-01-01
        • 2013-07-17
        相关资源
        最近更新 更多