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));
}
}
您的元数据测试对于每个查询都不是必需的。如果您添加了一个fail方法来处理任何错误(例如没有元数据),那么您只能编写一次,但实际上,如果您正在使用的任何服务类型的JavaScript文件都加载了元数据,那么元数据应该始终存在。如果您将数据调用转移到视图模型,那么我建议您重新考虑该策略 执行缓存检查的方式是可选的。请记住,有两种方法可以从缓存查询-executequerylocal和设置fetchStrategy。在某些情况下,您可能希望从服务器刷新数据,因此我建议您在每个查询中首先尝试从缓存中提取数据,并且只在需要时才访问数据库。一般来说,对于每个实体,我只有两种方法来检索所有数据,尽管如果您有点棘手,也可以将其简化为共享查询。当您可以将查询用于不同的orderBy、where子句等时,您的查询效率最高 最后,如果您只想返回一个实体,只需像返回任何其他数组一样执行此操作-在返回返回数组结果之前捕获返回的数组结果,并将其过滤为类似data.results[0]的内容。您还可以查询并使用筛选器查找第一个符合正弦条件的实体