客户端过滤如何为WCF IQueryable方法工作?

时间:2012-07-16 05:01:00

标签: wcf wcf-data-services odata iqueryable

我是WCF的新手,我需要帮助了解一些事情。

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

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

我理解IQueryable无法向客户端公开,但如果我在客户端上进行过滤(即MyServiceClient.GetMyDto().Where(x => x.SomeValue == 1)),它是否会在客户端或服务器上进行过滤?

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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

如果您正在使用DTO,则您位于Reflection Provider土地或Custom Provider土地。自定义提供程序允许极端定制,但这是一个非常大的学习曲线。 AlexJ在这个话题上有一个很好的blog post series。反思提供者在这一点上有一些不幸的限制,但是很难对它们进行专门的枚举,因此最好只是尝试一下,看看你遇到了哪些痛点。如果您没有达到这些限制,那么它非常易于使用,并且可能会帮助您构建服务。

团队中的几位成员真的想改善我们的提供商故事。我不能保证这将是我们在不久的将来工作的优先事项,但如果我们能解决的事情很少,我们很乐意听到它。