我还没有找到最优雅的方式来做这件事,寻找任何有良好经验的人查询大数据并仍然控制缓存 -
如果我出去打了服务器,让我说我得到了20k的记录,每个记录都带有Id和name属性。因为我想在与该数据集交互时利用我的缓存,所以我会缓存数据并用它做任务。
然后说我想查看一组新的数据,但不会丢失我的所有导航属性,所以我出去,点击服务器,向缓存中添加更多实体,然后因为我想查看我的数据我做一个选择查询来让POJO在网格中推进。
我第一次点击服务器并缓存这些记录时,我没有将任何过滤器应用于本地缓存并不重要。但是,第二次,我的缓存现在可能包含我想要使用的实体数量的两倍。
同样,我不想对数据进行大量复杂的过滤,这就是服务器的用途。
我不能再使用相同的查询参数来点击我的本地缓存,这是不可能的(或在合理范围内)
由于我使用Knockout.js进行数据绑定,我需要在返回数据后对数据使用select查询来获取POJO(ko.toJS()不会展平导航属性,ko.toJSON()不会不适用于Breeze实体,因为它认为它们是递归的)
我可以创建我的entityManager的副本,然后再次获取导航属性,然后重新查询数据,但之后我不得不做很多额外的查询
忽略该实体类型的缓存,因此当我用新实体重新填充它时,我可以获取要使用的数据。
答案 0 :(得分: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中有这样的东西。
答案 1 :(得分:-1)
这不是一个完整的解决方案,但是对于json你的数据,请使用:
ko.mapping.toJS(data,{ignore:['entityAspect','entityType']})