是否可以在OData中使用此代码?
IQueryable<CallLogInfo> CallLogInfos = _callCenterServiceAccessor.CallLogInfos.Where(x => x.LogId == logid);
var log = CallLogInfos.ToList();
return log.Any();
我检查了它生成的请求,我看到了这个:
http://services/CallCenter/CallCenterDataService.svc/CallLogInfos(1364974501.4)
所以得到这个错误:
<m:message xml:lang="en-US">Resource not found for the segment 'CallLogInfo'.</m:message>
但是当我手动向此请求提出请求时:
http://services/CallCenter/CallCenterDataService.svc/CallLogInfos
没关系。
答案 0 :(得分:2)
据我所知,您的代码应该是可能的。
假设LogId是您OData服务的Key列,您的代码
CallLogInfos.Where(x => x.LogId == logid);
将由OData服务内部转换为
http://services/CallCenter/CallCenterDataService.svc/CallLogInfos(logid)
这是获取具有特定Id的元素的标准语法。
如果对Id的查询未在列表中找到条目,则会引发您显示的错误消息,您是否检查过您提供的ID是否正确?
(如果这是问题,您可以通过设置服务上下文的(see MSDN)的IgnoreResourceNotFoundException属性来关闭此行为)
在我做的测试中,像你这样的查询确实有效,也许你的Odata服务实现包含错误?
您可以使用LinqPad之类的工具试用您的代码和服务,这有助于尝试这样的事情。