0

我正在尝试从 Windows 窗体中使用 OData。所以,我现在所做的是创建一个新项目,我向 OData 服务添加了一个 Web 服务引用并尝试使用它。

我的代码是:

var VistaEntities = new VrExternalEntities("serviceURI");
var query = VistaEntities.VRtblCinemaType
            .Where(
                     x => 
                     x.VRtblCinema_Operators
                          .Any
                          (
                              z => 
                              z.VRtblSessions
                              .Any
                              (
                                   y => 
                                   y.Session_dtmDate_Time > DateTime.Now
                              )
                          )
                   )
             .Select
             (
                 x => 
                 new 
                 {
                     x.CinType_strCode, 
                     x.CinType_strDescription 
                 }
             );

如果我删除 Where 子句,它会起作用。如果我这样做,它说 Any 不受支持。我知道我必须将 MaxProtocolVersion 设置为 V3,但我不知道该怎么做。我没有实体上下文或其他任何东西。我只有上面所说的。

请提供有关如何完成此操作的步骤。

提前致谢。

扬尼斯

4

1 回答 1

2

您必须检索您的配置并将DataService行为设置MaxProtocolVersion为.V3

执行此操作的最佳位置当然是您可以在服务类中定义的InitializeServiceconfig静态方法,环境将为该方法提供适当的配置对象作为其参数。它只会被调用一次,通常是在第一次请求时。

注意 #1: 您需要WCF 数据服务 5.0或更高版本。获得它的最佳方式可能是通过NuGet包。Server

注意 #2: 奇怪的是,该DataServiceProtocolVersion类型虽然在Common命名空间中,但包含在客户端程序集(Microsoft.Data.Services.ClientNuGet包提供)中。我在这里建议了一个更好的组织。Client

public class Vista : DataService<VistaContext>
{
    public static void InitializeService(DataServiceConfiguration config)
    {
        config.SetEntitySetAccessRule(...);
        config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;
        ...
    }
}

更新: 客户端确实可以通过使用HTTP 标头在请求中指定所需的版本。出于显而易见的原因,如果可以的话,目前建议您使用和标头DataServiceVersion指定并支持一系列版本。但请注意,将在OData 4.0中删除(请参阅第 1 部分的附录 E.1 和“新增功能”文档草稿)。MinDataServiceVersionMaxDataServiceVersionMinDataServiceVersion

此处提供了 WCF 数据服务 5.x 实现的相关文档。特定于客户端的文档似乎非常稀缺,但是查看参考资料,您可以看到您必须使用DataServiceContext的此构造函数来指定最大协议版本,并且看起来您无法在任何时候更改它以用于后续请求重建一个新的语境。您可能会尝试直接摆弄标题,但我不希望它可靠地工作(或根本不工作)。

因此,要回答您的问题,您确实需要控制如何为客户创建上下文。

于 2013-08-06T15:57:48.200 回答