0

我有一个看起来像这样的医生图表:

医师图

我用来从 WebApi 后端获取数据的查询如下所示:

      var query = new breeze.EntityQuery().from("Physicians")
    .expand("ContactInfo")
    .expand("ContactInfo.Phones")
    .expand("ContactInfo.Addresses")
    .expand("PhysicianNotes")
    .expand("PhysicianSpecialties")
    .where("ContactInfo.LastName", "startsWith", lastInitial).take(5);

(注意 ContactInfo 是 People 对象的化名)

我发现如果我请求扩展 Contact.Phones,我将只得到电话,而没有 Notes 或 Specialties。如果我注释掉电话,我会得到 Contact.Addresses 而没有其他集合。如果我将 ContactInfo 连同电话和地址一起注释掉,我只会得到笔记等。从本质上讲,似乎我一次只能得到一个集合。

那么,这是一个内置的“不要让程序员在脚上开枪”吗?保障还是我必须启用某些东西?

还是这张图太复杂了??我应该考虑使用 NoSql 对象存储吗?

谢谢

4

2 回答 2

1

您需要将所有扩展子句放在一个单独的子句中,如下所示:

var query = new breeze.EntityQuery().from("Physicians")
    .expand("ContactInfo, ContactInfo.Phones, ContactInfo.Addresses, PhysicianNotes, PhysicianSpecialties")
    .where("ContactInfo.LastName", "startsWith", lastInitial).take(5);

您可以在此处查看文档:http ://www.breezejs.com/sites/all/apidocs/classes/EntityQuery.html#method_expand

于 2013-02-21T17:36:52.503 回答
1

JY告诉你如何。但要注意性能后果......无论是在数据层还是在网络上。一次抓得太宽太深,你可能会死得很惨。

take(5)我在他的样本中看到了。这对于限制失控的请求至关重要(您确实必须在服务器上执行此操作)。一般来说,我会为提取单个根实体的查询保留这种类型的扩展图提取。如果我要呈现一个供选择的列表并且我需要来自实体图不同部分的数据,我会使用投影来准确获取我需要显示的内容(当然,假设没有现成的 SQL 视图可用于这个目的)。

如果任何相关项目是参考列表(颜色、状态、状态等),请考虑在准备步骤中将它们单独放入缓存中。不要将它们包含在expand; Breeze 会在客户端自动将它们连接到您查询的实体。

最后,作为语法问题,您不必重复段的名称。当您编写“ContactInfo.Phones”时,您会同时获得 ContactInfos 和 Phones,因此您不需要单独指定“ContactInfo”。

于 2013-02-22T17:08:59.833 回答