1

TL : DR - 使用带有 Breeze.js 的大数据

我还没有找到最优雅的方法来做到这一点,寻找具有查询大数据并仍然控制缓存的良好经验的人 -

如果我出去访问服务器,假设我得到了 20k 条记录,每条记录都有一个 Id 和一个 name 属性。因为我想在与该数据集交互时利用我的缓存,所以我缓存数据并用它做一些事情。

然后说我想查看一组新数据,但又不想丢失所有导航属性,所以我出去,点击服务器,将更多实体添加到缓存中,然后因为我喜欢查看我的数据,所以我做了一个选择查询以使 POJO 推入网格。

我第一次访问服务器并缓存这些记录时,我没有对本地缓存应用任何过滤器并不重要。然而,第二次,我的缓存现在可能包含两倍于我想要使用的实体数量。

同样,我不想对数据进行很多复杂的过滤,这就是服务器的用途。

问题

如果不使用相同的查询参数,我不能再访问我的本地缓存,这是不可能的(或在合理范围内)

由于我使用 Knockout.js 进行数据绑定,我需要在返回数据后对数据使用选择查询以获取 POJO(ko.toJS() 不会展平导航属性,ko.toJSON() 不起作用在 Breeze 实体上,因为它认为它们是递归的)

半途而废的解决方案

我可以创建我的 entityManager 的副本,出去再次获取导航属性,然后重新查询数据,但是我不得不做很多额外的查询

我想做什么

清除该实体类型的缓存,这样当我用新实体重新填充它时,我就可以获取该数据以进行处理。

4

2 回答 2

2

没有清除特定实体类型缓存的官方方法。你可以这样做

manager.getEntities('Foo').forEach(function(foo) {manager.detachEntity(foo);});

这是一种减法。如果您知道相关类型是什么,并且认为从一个新的管理器开始并添加相关类型而不是直接删除您想要杀死的类型,那么您可以考虑一种加法方法。

我不认为那是你真正想要做的,所以我只会为它编写伪代码。

  • 提取相关类型:var related = manager.getEntities(['a', 'b', 'c']);. 你只需要这样做一次;related此后一次又一次地使用。

  • 在下一个查询之前清除经理:manager.clear();

  • 附上相关实体:related.forEach(function(entity){manager.attachEntity(entity);});

  • 执行您的下一个“foo”查询。

我不知道哪种方法更适合您的应用程序。

您可以(在用户语音中)提出一个新的 EntityManager 方法,该方法清除单个类型(或类型数组)的缓存。可能是该方法的可选参数EntityManager.clear()。我们在 DevForce 中有这样的东西。

于 2013-10-24T00:46:26.147 回答
-1

这不是一个完整的解决方案,但要 json 你的数据,使用这个:

ko.mapping.toJS(数据, { 忽略: ['entityAspect', 'entityType'] })

于 2013-10-23T23:27:32.683 回答