C# ExpressionVisitor.Visit抛出';必须是可约节点';数据服务查询访问者中出现错误

C# ExpressionVisitor.Visit抛出';必须是可约节点';数据服务查询访问者中出现错误,c#,wcf-data-services,linq-expressions,expressionvisitor,C#,Wcf Data Services,Linq Expressions,Expressionvisitor,我的WCF数据服务的存储库模式的实现有问题。总而言之,我试图在客户机应用程序中使用一种存储库模式,该模式为所需的存储库使用一个可插入的模型。根本问题是我的存储库接口IRepository只能知道它存储的项的接口类型变量。这是为了将客户机应用程序从订单的数据服务实现中抽象出来,例如 IRepository<IOrder> : IQueryable<T> 但是,在客户端级别,如果我使用Cast强制该类型,那么它就可以工作了 repository.Cast<Order&

我的WCF数据服务的存储库模式的实现有问题。总而言之,我试图在客户机应用程序中使用一种存储库模式,该模式为所需的存储库使用一个可插入的模型。根本问题是我的存储库接口IRepository只能知道它存储的项的接口类型变量。这是为了将客户机应用程序从订单的数据服务实现中抽象出来,例如

IRepository<IOrder> : IQueryable<T>
但是,在客户端级别,如果我使用Cast强制该类型,那么它就可以工作了

repository.Cast<Order>(order => order.Id).ToList(); // Suceeds
这对于非数据服务查询(例如,类似于可查询的列表)很好,但对于数据服务存储库模式查询,您会收到一条毫无帮助(至少对我来说)的消息“必须是可还原节点”。我猜测的是,表达式树访问者遇到了数据服务查询自定义的节点类型,不知道如何处理它。然而,我认为ExpressionVisitor会简单地复制树上的内容,除非被告知做一些不同的事情


无论如何,我要问的是,如何使用这个ExpressionVisitor和OData查询替换查询的返回类型?我试图寻找某种现有的数据服务表达式访问者,但找不到。我希望我的客户端数据服务从接口类型查询生成查询,但返回相同名称的强类型。

看看MongOData,它是使用WCF数据服务自定义提供程序构建的MongoDB OData提供程序:

在将查询转换为MongoDB LINQ表达式和将结果转换为DSPResource时,它处理表达式访问者


注意!你想要达到的目标并不容易。但是希望这个例子有帮助。

希望这个帮助:我删除了存储库模式标记,因为您所做的与存储库模式无关。该模式用于抽象出数据源,从而降低了复杂性非常感谢,我将对此进行研究,我觉得我与当前的实现非常接近,如果可以避免的话,希望避免完全切换提供程序。
repository.Cast<Order>(order => order.Id).ToList(); // Suceeds
MyVisitor : ExpressionVisitor