oData中的Where子句

时间:2013-04-12 05:05:12

标签: c# wcf-data-services odata

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

没关系。

1 个答案:

答案 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之类的工具试用您的代码和服务,这有助于尝试这样的事情。