【发布时间】:2010-06-16 00:03:45
【问题描述】:
我有一个基于 LINQ to SQL 数据提供程序的 WCF 数据服务。
我正在查询“获取两个日期之间的所有记录”。
问题是我想合成两条额外的记录,这样我总是得到落在开始日期和结束日期的记录,再加上所有来自数据库的记录。
有没有办法“拦截”请求,以便我可以综合这些记录并将它们返回给客户端?
谢谢
【问题讨论】:
标签: wcf wcf-data-services
我有一个基于 LINQ to SQL 数据提供程序的 WCF 数据服务。
我正在查询“获取两个日期之间的所有记录”。
问题是我想合成两条额外的记录,这样我总是得到落在开始日期和结束日期的记录,再加上所有来自数据库的记录。
有没有办法“拦截”请求,以便我可以综合这些记录并将它们返回给客户端?
谢谢
【问题讨论】:
标签: wcf wcf-data-services
我怀疑答案涉及使用“拦截器”。
偶然发现这个... http://msdn.microsoft.com/en-us/library/dd744842.aspx
【讨论】:
我想得越多,我就越会说“请不要这样做”。问题在于,在 WCF 数据服务(或 OData)中,您返回的每个实体(实体 == 记录)都需要有其唯一的 URI。客户端还假设如果实体从服务器返回(除非它被删除),则可以再次访问该实体。 但是,在您的情况下,边界实体由查询定义,它们实际上只存在于查询的上下文中。给定不同的查询,它们是不同的。所以总而言之,它们的行为不像实体,它们更像某种查询元数据。
不管怎样,如果你真的认为这是正确的做法……这很难做到。我能想到的唯一方法是挂钩从实体集返回的 IQueryable(将您自己的 IQueryable 放在从 LINQ 到 SQL 的 IQueryable 之上)。然后,当执行查询时,您解析表达式树并找到定义范围的条件,然后返回 IEnumerable 的自定义实现,它将在开始和结束时“合成”两个特殊实体,并将返回从底层 LINQ to SQL 结果中休息。所有这些都是很多代码,而且绝对不容易做到。
第二种可能的方法是将其实现为服务操作(但要求客户端知道服务器上有一个特殊操作来执行此操作)。这也会更有意义,因为服务操作会将范围作为其参数而不是过滤器,因此您更容易找出范围(没有表达式树解析)。
【讨论】: