我目前有一个C#winform应用程序,您可以在其中输入最终为关系的数据。存储的数据量并不大。原始版本使用SQL CE来存储信息。但是,我发现它很慢。此外,我希望能够使用我自己的扩展名保存应用程序文件。
我改变了我的方法,基本上使用类对象将数据加载到内存中。为了保存,我只是使用ProtoBuf序列化所有内容并在打开文件时反序列化。这种方法非常快速,在用户单击“保存”之前,更改永远不会持续存在。但是,我发现查询分层数据有点麻烦。我使用Linq-To-Objects查询数据。我将使用具有GUID密钥的ClassA。我可以通过GUID引用ClassB中的ClassA。但是,我无法通过简单的SQL连接类型查询来获取ClassB属性以及ClassA属性。我通过在ClassB到ClassA上创建一个导航属性来解决这个问题,该属性通过GUID上的LINQ查询返回ClassA。但是,这会导致大量的集合扫描。
哪些选项可以为我提供快速,单用户的关系文件存储?我仍然希望在内存中工作,在用户使用“文件”|“保存”之前,不会持续进行更改。我还希望能够继续使用LINQ查询数据。我正在考虑将SQLite作为一种选择。那里有更好的选择或方法吗?
更新
我没有意识到ProtoMember属性[ProtoMember(5, AsReference = true)]
中的AsReference选项。如果我在我的类中放弃外键并简单地引用相关对象,那么看起来我能够在保持对象引用的同时使用ProtoBuf进行序列化和反序列化。因此,我可以轻松地使用Linq-To-Objects查询我的对象。我需要从数据库方面停止思考。
答案 0 :(得分:0)
如果你的所有对象都是某种层次结构,你也可以在4字节/对象(32位机器)的开销下将完全相同的对象存储在其他结构中。
假设您有一个基础对象:
public class HierarchyElement
{
public List<HierarchyElement> Children { get; set; }
public HierarchyElement Parent { get; set; }
}
所以你有一个局部变量的根元素,它通过Children属性,以及那些第一个子元素的Children属性等,在层次结构中存储未知数量的对象。
但是,在构建该对象时,或者在对其进行反序列化之后,可以将每个HierarchyElement的引用添加到List(或您选择的其他平面结构)。
然后,您可以使用此平面列表来执行Linq查询。