将 Breeze 与 OData 结合使用并调用 entityManager.FetchEntityByKey() 时,会发送以下请求:
/odata/Customers?$filter=Id eq 2
我早就料到了
/odata/Customers(2)
是否可以使用后者制作 Breeze?
2013 年 12 月 10 日更新:
是的!我发现我可以执行以下操作(恕我直言,FetchEntityByKey 应该这样做):
entityManager.executeQuery('Cusotmer(2)') ...
然后发出以下请求:
/odata/Customers(2)
但是!现在看来 Breeze (v1.9.6) 无法正确处理结果。返回结果数组为空。实际上它应该只返回一个项目(实体)而不是一个数组。
UserVoice 链接
我创建了一个 UserVoice feedback
最佳答案
你真的关心 Breeze 生成的 url 是 /odata/Customers(2)
还是 /odata/Customers?$filter=Id eq 2
?为什么?
它们都是合法的 OData。 OData 服务器会很乐意为您提供对任一查询的正确答案。
Breeze 确实更喜欢后者。原因如下。
Customers(2)
语法返回一个对象或 null(不是 404-unfound)。
Customers?$filter=Id eq 2
过滤器语法总是返回一个数组。该数组有一项或零项。但是你会得到一个数组。
我们在客户端的一个简化是查询总是返回一个 data.results
数组。我们有一个查询结果 API,无论您如何查询,data.results
始终是一个数组。您不必为 null 测试 data.results
。而且您不必记住“我的查询返回的是对象还是数组?”
这是我们的指导性客户端一致性原则。我们不太可能偏离这一原则。
碰巧,您可以拦截 URL 生成并根据需要更改它。那是给你的练习。当然(正如您发现的那样)您必须做一些工作才能将结果转回数组。忽略去做是我怀疑您试图将 Breeze 引入其他语法 Customers(2)
导致令人困惑的空数组结果的原因。
除非有令人信服的理由支持,否则我们不太可能更改默认行为。
关于odata - 调用 FetchEntityByKey 的 Breeze/OData 确实使用过滤器(未使用 EntitySetController.GetEntityByKey),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20440358/