Breeze / OData调用FetchEntityByKey确实使用过滤器(未使用EntitySetController.GetEntityByKey)

时间:2013-12-07 10:41:43

标签: odata breeze

当使用Breeze和OData并调用entityManager.FetchEntityByKey()时,会发送以下请求:

/odata/Customers?$filter=Id eq 2

我原本预计

/odata/Customers(2)

是否可以使用后者制作Breeze?

更新2013-12-10:

YES!我发现我可以做以下事情(imho FetchEntityByKey应该这样做):

entityManager.executeQuery('Cusotmer(2)') ...

然后发出以下请求:

/odata/Customers(2)

BUT!现在看来Breeze(v1.9.6)无法正确处理结果。返回的结果数组为空。实际上它应该只返回一个项目(实体)而不是一个数组。

链接到UserVoice

我创建了UserVoice feedback

1 个答案:

答案 0 :(得分:2)

您真的关心Breeze生成的网址是/odata/Customers(2)还是/odata/Customers?$filter=Id eq 2?为什么呢?

他们都是合法的OData。 OData服务器很乐意为您提供正确的查询答案。

微风确实偏爱后者。这就是原因。

Customers(2)语法返回一个对象或null (不是404-unfound)。

Customers?$filter=Id eq 2过滤器语法始终返回数组。该数组有一个项目或零项目。但是你会得到一个数组。

我们在客户端的一个简化是查询总是返回data.results数组。我们有一个查询结果API,无论您如何查询,data.results始终是一个数组。您不必为data.results测试null。而且你不必记住" 我的查询是返回一个对象还是一个数组?"

这是我们指导的客户端一致性原则。我们不太可能偏离这个原则。

实际上,您可以拦截URL生成并根据需要进行更改。这对你来说是一种锻炼。当然(正如您所发现的),您必须做一些工作才能将结果转换回数组。忽略这一点是我怀疑你试图将Breeze引入其他语法Customers(2)导致令人困惑的空数组结果的原因。

我们不太可能改变默认行为,除非我们得到一些严重的推迟,并有令人信服的理由支持。