2012-07-16 74 views
0

我是WCF的新手,我需要帮助理解一些东西。客户端过滤如何为WCF IQueryable方法工作?

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

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

据我所知IQueryable不能公开给客户端,但如果我在客户端上筛选(即MyServiceClient.GetMyDto().Where(x => x.SomeValue == 1))它是否过滤客户端或服务器上?

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

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

回答

1

添加到什么拉吉斯拉夫说(这是完全准确):

如果您使用的DTO,你在任何的反思提供土地或自定义提供土地。自定义提供程序允许极度自定义,但这是一个相当大的学习曲线。 AlexJ在这个话题上有非常出色的blog post series。反射提供者在这一点上有一些不幸的局限性,但是很难列举它们,所以最好只尝试一下,看看你遇到的痛点。如果您没有达到这些限制,那么使用起来非常简单,并且可能在帮助您建立服务方面做得很好。

团队中的几位成员真的想提高我们的提供者故事。我不能保证这将是我们在不久的将来的工作重点,但如果我们能够解决的事情很少,我们很乐意听到。

1

WCF数据服务的要点是向客户端公开IQueryable。当您使用数据服务客户端时,您正在查询IQueryable。你的查询被翻译成OData查询字符串(URL的一部分)并传递给服务器执行。

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