0

考虑以下代码:

function getPersonById(personId, type) {

 var p1 = new breeze.Predicate("Id", "==", personId);    
 var p2 = new breeze.Predicate("Type", "==", type);        
 var query = breeze.EntityQuery.from("Contacts").where(p1.and(p2))

 if (!manager.metadataStore.hasMetadataFor(service.serviceName)) {
      return manager.fetchMetadata().then(function () {
          return manager.executeQuery(query.using(service));
      });
 } else {
      var fromCache = manager.getEntityByKey('Contact', personId);
       if (fromCache)
             return Q.resolve(fromCache);
        return manager.executeQuery(query.using(service));
 }
}
  1. 我做事的方式正确吗?在我看来,我必须编写大量样板代码来获取实体。我必须确保元数据是已知的,然后确定实体是否已经在缓存中。

  2. 我面临一个问题,因为如果调用 executeQuery,则返回值是一个数组。但是,如果调用 getEntityByKey,则返回值是一个实体。我该如何以优雅的方式处理它?有没有办法强制 executeQuery 返回单个实体而不是数组?(无论如何,我希望只有一个返回值)

4

1 回答 1

1

您的元数据测试不应该对每个查询都是必需的。如果您添加一个处理任何错误(例如没有元数据)的失败方法,您只能编写一次,但实际上,如果您使用的任何服务类型 JavaScript 文件被加载,元数据应该始终存在。如果您要将数据调用移动到视图模型,那么我建议您重新考虑该策略。

您进行缓存检查的方式是可选的。请记住,有两种方法可以从缓存中查询 - executeQueryLocally 和设置 fetchStrategy。在某些情况下,您会希望从服务器刷新数据,因此我绝对建议您在每个查询中首先尝试从缓存中提取数据,并且仅在需要时才访问数据库。通常,对于每个实体,我的所有数据检索只有两种方法,尽管如果您很棘手,您也可以将其简化为共享查询。当您可以将它们重用于不同的 orderBy、where 子句等时,您的查询是最有效的......

最后,如果您只想返回一个实体,只需像其他数组一样执行它 - 在将返回的数组结果发送回之前捕获返回的数组结果并将其过滤为 data.results[0] 之类的内容。您还可以查询然后使用过滤器来查找满足正弦条件的第一个实体。

于 2013-06-28T14:15:19.277 回答