breezejs:与从数据库获取实体与从缓存获取实体混淆

breezejs:与从数据库获取实体与从缓存获取实体混淆,breeze,Breeze,考虑以下代码: 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.

考虑以下代码:

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));
 }
}
  • 我做事情的方式正确吗?在我看来,仅仅为了获取一个实体,我就必须编写大量的锅炉板代码。我必须确保元数据是已知的,然后确定实体是否已经在缓存中

  • 我面临一个问题,因为如果调用executeQuery,那么返回值就是一个数组。但是,如果调用getEntityByKey,则返回值是一个实体。我怎样才能优雅地处理这个问题?有没有办法强制executeQuery返回单个实体而不是数组?(无论如何,我只希望返回一个值)


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

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

    最后,如果您只想返回一个实体,只需像返回任何其他数组一样执行此操作-在返回返回数组结果之前捕获返回的数组结果,并将其过滤为类似data.results[0]的内容。您还可以查询并使用筛选器查找第一个符合正弦条件的实体