0

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

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

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

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

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

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

4

2 回答 2

1

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

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

于 2012-07-16T09:42:58.930 回答
1

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

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

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

于 2012-07-16T15:36:01.780 回答