【问题标题】:Extending WCF Data Service to synthesize missing data on request扩展 WCF 数据服务以根据请求合成缺失的数据
【发布时间】:2010-06-16 00:03:45
【问题描述】:

我有一个基于 LINQ to SQL 数据提供程序的 WCF 数据服务。

我正在查询“获取两个日期之间的所有记录”。

问题是我想合成两条额外的记录,这样我总是得到落在开始日期和结束日期的记录,再加上所有来自数据库的记录。

有没有办法“拦截”请求,以便我可以综合这些记录并将它们返回给客户端?

谢谢

【问题讨论】:

    标签: wcf wcf-data-services


    【解决方案1】:

    我怀疑答案涉及使用“拦截器”。

    偶然发现这个... http://msdn.microsoft.com/en-us/library/dd744842.aspx

    【讨论】:

      【解决方案2】:

      我想得越多,我就越会说“请不要这样做”。问题在于,在 WCF 数据服务(或 OData)中,您返回的每个实体(实体 == 记录)都需要有其唯一的 URI。客户端还假设如果实体从服务器返回(除非它被删除),则可以再次访问该实体。 但是,在您的情况下,边界实体由查询定义,它们实际上只存在于查询的上下文中。给定不同的查询,它们是不同的。所以总而言之,它们的行为不像实体,它们更像某种查询元数据。

      不管怎样,如果你真的认为这是正确的做法……这很难做到。我能想到的唯一方法是挂钩从实体集返回的 IQueryable(将您自己的 IQueryable 放在从 LINQ 到 SQL 的 IQueryable 之上)。然后,当执行查询时,您解析表达式树并找到定义范围的条件,然后返回 IEnumerable 的自定义实现,它将在开始和结束时“合成”两个特殊实体,并将返回从底层 LINQ to SQL 结果中休息。所有这些都是很多代码,而且绝对不容易做到。

      第二种可能的方法是将其实现为服务操作(但要求客户端知道服务器上有一个特殊操作来执行此操作)。这也会更有意义,因为服务操作会将范围作为其参数而不是过滤器,因此您更容易找出范围(没有表达式树解析)。

      【讨论】:

      • 我认为这个问题发生的全部原因是因为我怀疑是 MS 的不良做法......提供了使用 DataService 类通过 OData 公开数据库的简单方法。然后每个人都这样做是因为它很容易,但是从什么时候将您的实现细节(数据库模式)暴露给外界是一个好主意??
      • 其实我们建议您在DB和DataService之间使用EF。这样你就不会暴露实现细节。相反,您可以通过使用正确的 EF 模型来选择哪些部分以及如何公开。使用 LINQ to SQL,您仍然有一些隐藏 DB 模式的可能性,但它并不那么丰富。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-21
      相关资源
      最近更新 更多