WCF IQueryable方法的客户端筛选是如何工作的



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

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

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

我知道IQueryable不能向客户端公开,但如果我在客户端(即MyServiceClient.GetMyDto().Where(x => x.SomeValue == 1))上进行筛选,它是在客户端还是服务器上进行筛选?

我的理解是它可以使用odata,但是我看到的所有例子都直接向客户端公开了实体模型,而我并没有这样做。我正在使用DTO。

我的局限性是什么?当我打电话给服务时,请帮助我准确了解发生了什么。

添加Ladislav所说的内容(完全准确):

如果您正在使用DTO,则您位于反射提供程序区域或自定义提供程序区域。自定义提供者允许进行极端的自定义,但这是一个相当大的学习曲线。AlexJ有一个关于这个主题的优秀博客系列。反射提供程序在这一点上有一些不幸的局限性,但很难具体列举它们,所以最好尝试一下,看看在哪里会遇到痛点。如果你没有达到这些限制,它非常容易使用,可能会在帮助你构建服务方面做得很好。

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

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

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

最新更新