breezejs:使用FetchStrategy.FromLocalCache时的inlineCount

时间:2013-06-05 09:10:52

标签: breeze

当数据来自缓存而不是服务器时,将inlineCount添加到结果集是否有意义?

我在本地存储计数,所以只要不离开当前网址(我使用angularjs),我就可以从控制器中的变量中获取它。但是一旦我离开了这个网址,如果我回到它,数据仍将来自缓存,但我的本地变量将重置为初始值。

1 个答案:

答案 0 :(得分:2)

2015年3月12日更新

已经提交了必要的更改,并且应该在下一个版本(1.5.3之后)发布。

当然,inlineCount 仅在异步查询执行中可用

  

同步em.executeQueryLocally(query)会立即返回分页结果数组;没有地方可以容纳inlineCount

以下是DocCode.queryTests中新的相应测试的摘录:" can page queried customers in cache with inline count"

  var query = EntityQuery.from('Customers')
      .where('CompanyName', 'startsWith', 'A')
      .orderBy('CompanyName')
      .skip(2).take(2)
      .inlineCount()
      .using(breeze.FetchStrategy.FromLocalCache);

  return em.executeQuery(query)
           .then(localQuerySucceeded);

  function localQuerySucceeded(data) {
    var custs = data.results;
    var count = custs.length;
    equal(count, 2,
        "have full page of cached 'A' customers now; count = " + count);

    var inlineCount = data.inlineCount;
    ok(inlineCount && inlineCount > 2,
      'have inlineCount=' + inlineCount + ' which is greater than page size');
  }

2014年5月9日更新

经过多次思考后,我确定你们都是对的,我错了。我在内部跟踪系统中输入了功能请求#2267。没有承诺我们何时完成它(我很快就相信);留在我们身上。

原始

我认为支持inlineCount缓存查询是有意义的,因为Breeze无法计算该值。

和我一起走过去。您使用内联计数和页面大小为5项向服务器发出分页查询。

// Get the first 5 Products beginning with 'C'
// and also get the total of all products beginning with 'C'
var query = EntityQuery.from("Products")
    .where("ProductName", "startsWith", "C")
    .take(5)
    .inlineCount()
    .using(manager);

假设你运行一次,服务器报告有142' C'数据库中的客户。

好的,现在采取相同的查询并在本地执行:

query.using(FetchStrategy.FromLocalCache).execute().then(...).fail(...);

Breeze怎么会知道伯爵?它只在缓存中有5个实体。怎么知道有142个C'客户在数据库中?它不能。

我认为您最好的选择是检查返回的数据对象,看它是否具有inlineCount值。如果查询是远程的,则仅重置计数的绑定副本。