1

是否可以在 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>

但是当我手动向这个请求 url 发出请求时:

http://services/CallCenter/CallCenterDataService.svc/CallLogInfos

没关系。

4

1 回答 1

2

据我所知,像您的代码这样的请求应该是可能的。

假设 LogId 是您的 OData 服务的 Key 列,您的代码

CallLogInfos.Where(x => x.LogId == logid);

将由 OData 服务在内部转换为

http://services/CallCenter/CallCenterDataService.svc/CallLogInfos(logid)

这是获取具有特定 ID 的元素的标准语法。

您显示的错误消息被抛出,如果对 Id 的查询未在列表中找到条目,您是否检查过您提供的 Id 是否正确?

(如果这是问题所在,您可以通过设置服务上下文的 IgnoreResourceNotFoundException 属性来关闭此行为(请参阅 MSDN)

在我进行的测试中,像您这样的查询确实有效,也许您的 Odata 服务实现包含错误?

您可以使用LinqPad 之类的工具来尝试您的代码和服务,这有助于尝试类似的事情。

于 2013-04-12T09:52:58.610 回答