如何处理跨远程和缓存数据的查询

时间:2012-12-05 23:40:14

标签: breeze

希望找到一种同时查询远程数据和本地缓存的好方法。我需要能够查询远程数据,但将结果与本地更改合并。

所以,如果我添加一个项目“Bob”,我按字母顺序排序升序前5个结果,而不是接收“Aaron,Adam,Alice,Ashley,Bud”,我会接受“Aaron,Adam,Alice,Ashley ,Bob“如果我查询了第二个5个结果(跳过5,取5),列表将以”Bud“开头。这也需要处理删除,所以如果我在本地删除了第1项和第3项,并且我查询了前50项,我想收到第2项和第4项到第52项。最后,过滤查询需要同时解决服务器和本地缓存更改:因此,如果我将“Sam”的名称更改为“Bob”并查询以B开头的所有名称,我应该与Bill和其他人一起获得Sam的新Bob记录。

通常我们只会使用初始查询下载所有行,并允许queryLocally处理工作,但是存在一个问题,因为我们正在使用10,000条或更多条记录。

感谢任何帮助!

3 个答案:

答案 0 :(得分:1)

您的方案的一个可能的解决方案是查询服务器“稍微多一点”然后作为结果预期 - 但最终总是过滤本地缓存。使本地缓存成为唯一的源,并从中过滤/获取/跳过。

现在让我们尝试定义“多一点”的含义。

  

如果我将“Sam”的名字改为“Bob”并查询以B开头的所有名字,我应该得到Sam与Bill和他们的新Bob记录。

这应该按照您的预期工作 - 无需从服务器获取更多“以B开头的名称”。

  

如果我添加一个项目“Bob”,我按字母顺序排序升序前5个结果,而不是接收“Aaron,Adam,Alice,Ashley,Bud”,我会接受“Aaron,Adam,Alice,Ashley, Bob“如果我查询了第二个5个结果(跳过5,取5),那么列表将以”Bud“开头。

要实现此目的,您需要像这样远程提取: numberOfEntitiesChangedLocally + ( pageNr * recordsPerPage ),然后以常规方式跳过并从本地缓存中获取。

答案 1 :(得分:0)

位于\ Samples \ DocCode中的组合远程+本地查询有三个示例。也许他们会有所帮助。

这里添加了评论。完整代码在queryTests.js

1。         *结合远程和本地查询以获得所有客户         *包括新的,未保存的客户         * v1 - 使用FetchStrategy

2。         *结合远程和本地查询以获得所有客户         *包括新的,未保存的客户         * v1 =使用FetchStrategy.FromLocalCache

3。         *结合远程和本地查询以获得所有客户         *包括新的,未保存的客户         * v2 =使用ExecuteLocally()

一个有趣的例子,如何不再这样做也可能会让你感兴趣(同样在queryTests中:

    /*********************************************************************
    * This portion of the "queryTests (by id)" module  
    * tests a hand-built async getById utility that was the way to do it 
    * before EntityManager.fetchEntityByKey
    * A curiosity now.
    ********************************************************************/

    // This hand-built async getById utility method returns a promise.
    // A successful promise returns the entity if found in cache 
    // or if found remotely.
    // Returns null if not found or if found in cache but is marked deleted.
    // Caller should check for query failure.
    // 'queryResult' reports if queried the remote service 
    // and holds a found entity even if it is marked for deletion.
    // 
    // This fnc has been replaced by EntityManager.getEntityByKey.

答案 2 :(得分:0)

这必须可以在java脚本中实现,银光可以做到有人可能需要看看它是如何完成的是银光并将其移植到java脚本。

我认为逻辑应该是设置开关时(AlwaysRefreshDataOnQuery = false),然后跳过,覆盖已修改的行(包括删除),否则只需清除本地缓存并用新数据刷新它。

Silver Light是一个非常强大的平台,迄今为止我还没有看到任何像银光一样强大的平台(至少在.NET世界中)。