Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 单用户应用程序文件/数据存储建议_Database_Linq_Sqlite_Linq To Objects_Protobuf Net - Fatal编程技术网

Database 单用户应用程序文件/数据存储建议

Database 单用户应用程序文件/数据存储建议,database,linq,sqlite,linq-to-objects,protobuf-net,Database,Linq,Sqlite,Linq To Objects,Protobuf Net,我目前有一个C winform应用程序,您可以在其中输入最终是关系型的数据。存储的数据量不是很大。原始版本使用SQL CE存储信息。然而,我发现它相当慢。此外,我希望能够使用自己的扩展名保存应用程序文件 我改变了方法,基本上使用类对象将数据加载到内存中。为了保存,我只需使用ProtoBuf序列化所有内容,并在打开文件时进行反序列化。这种方法速度极快,在用户单击“保存”之前,更改不会持久化。然而,我发现查询我的分层数据有点麻烦。我使用Linq查询数据到对象。我会让ClassA有一个GUID键。我可

我目前有一个C winform应用程序,您可以在其中输入最终是关系型的数据。存储的数据量不是很大。原始版本使用SQL CE存储信息。然而,我发现它相当慢。此外,我希望能够使用自己的扩展名保存应用程序文件

我改变了方法,基本上使用类对象将数据加载到内存中。为了保存,我只需使用ProtoBuf序列化所有内容,并在打开文件时进行反序列化。这种方法速度极快,在用户单击“保存”之前,更改不会持久化。然而,我发现查询我的分层数据有点麻烦。我使用Linq查询数据到对象。我会让ClassA有一个GUID键。我可以通过GUID引用ClassB中的ClassA。然而,我不能真正做一个简单的SQL连接类型查询来获得ClassB属性和ClassA属性。我通过在ClassB到ClassA上创建一个导航属性来解决这个问题,该属性通过GUID上的LINQ查询返回ClassA。但是,这会导致大量的集合扫描

有哪些选项可以为我提供快速、单用户的关系文件存储?我仍然希望在内存中工作,在用户使用File | Save之前更改不会持久化。我还希望能够继续使用LINQ查询数据。我将SQLite视为一个选项。对我来说有更好的选择或方法吗

更新


我不知道ProtoMember属性[ProtoMember5,AsReference=true]中的AsReference选项。如果我放弃类中的外键,只引用相关的对象,那么看起来我可以在保留对象引用的同时使用ProtoBuf进行序列化和反序列化。因此,我可以轻松地使用Linq To对象来查询我的对象。我需要停止从数据库方面思考问题。

如果所有对象都采用某种层次结构,也可以在其他结构中存储完全相同的对象,开销为4字节/对象32位机器

假设您有一个基本对象,如:

public class HierarchyElement
{
    public List<HierarchyElement> Children { get; set; }
    public HierarchyElement Parent { get; set; }
}
因此,在局部变量中有根元素,它通过Children属性和第一个子元素的Children属性等在层次结构中存储未知数量的对象

但是,在构建该对象时或反序列化该对象后,可以将对每个HierarchyElement的引用添加到列表或您选择的其他平面结构中


然后,您可以使用此平面列表对进行Linq查询。

进一步查看Protobuf,我似乎可以继续使用它,但我可以引用实际对象,而不是使用ID进行外键控。如果我使用[ProtoMemberN,AsReference=true]属性,引用将被序列化。我想我脑子里一直想着数据库表的结构。