1

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

因此,如果我添加一个项目“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 开头的名称,我应该得到 Sam 与 Bill 和其他人的新 Bob 记录。

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

任何帮助表示赞赏!

4

3 回答 3

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 )然后跳过并以通常的方式从本地缓存中获取。

于 2012-12-06T11:17:06.683 回答
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.
于 2012-12-06T00:36:33.397 回答
0

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

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

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

于 2012-12-09T07:24:22.357 回答