我试图从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子句,它的工作原理。如果我这样做说任何不受支持。我知道我必须将MaxProtocolVersion设置为V3,但我不知道该怎么做。我没有实体上下文或其他任何内容。我只有我上面所说的。
请提供有关如何实现这一目标的步骤。
提前致谢。
Giannis
答案 0 :(得分:1)
您必须检索configuration的DataService
并将MaxProtocolVersion
的its behavior设置为V3
。
执行此操作的最佳位置当然是您可以在服务类中定义的InitializeService静态方法,该方法将由环境为其config
参数提供正确的配置对象。它只会被调用一次,通常是在第一次请求时。
注意#1:您需要WCF Data Services 5.0或更高版本。获得它的最佳方法可能是通过Server
NuGet包。
注意#2:奇怪的是,DataServiceProtocolVersion
类型虽然位于Common
命名空间中,但却包含在客户端程序集(Microsoft.Data.Services.Client
中,由Client
NuGet包裹。我建议了一个更好的组织here。
public class Vista : DataService<VistaContext>
{
public static void InitializeService(DataServiceConfiguration config)
{
config.SetEntitySetAccessRule(...);
config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;
...
}
}
<强>更新强>
通过使用DataServiceVersion
HTTP标头,客户端确实可以specify the desired version in the requests。如果可以的话,目前建议您使用MinDataServiceVersion
和MaxDataServiceVersion
标头指定并支持一系列版本,原因很明显。但请注意,MinDataServiceVersion
中的{{1}}将被删除(参见第1部分附录E.1和“新内容”文件草稿)。
WCF Data Services 5.x实施的相关文档可用OData 4.0。特定于客户端的文档似乎很少,但是查看参考文献,您可以看到必须使用here this constructor来指定最大协议版本,它看起来像{{3}在任何一点上为后续请求而不重建新上下文。您可以直接尝试DataServiceContext,但我不希望它可靠地(或根本)工作。
因此,要回答您的问题,您确实需要控制如何为客户创建上下文。