任何人都可以为非sql数据库查询界面设计模式提供一些参考吗?
对于基于sql的数据库,可以通过组合查询令牌来实现查询。 但对于非sql,如何设计查询,因为查询可能非常复杂。
修改
我使用db4o存储一些对象,我可能需要根据某个ID,时间范围或它们的组合进行查询。
如何设计查询方法?
public IEnumerable<Foo> GetFoos(int id);
public IEnumerable<Foo> GetFoos(int id, TimeRange range);
构建大量的重载似乎很愚蠢,如果需要新的查询怎么办?
答案 0 :(得分:3)
在C#中,最好使用Linq。本机查询通常无法优化,这将导致db4o水合所有对象,并实际调用实例化对象上的lambda表达式。这只不过是对linq到对象的自动回退,而且相比之下它本来就很慢。仅仅保湿60k的典型物体需要几秒钟。
提示:绝不能调用lambda表达式的断点。
即使使用Db4oTool.exe
优化本机查询作为构建后步骤,即使简单查询在域对象中使用属性或自动属性时也会出现问题。
linq提供商总是给我最好的结果。它具有最简洁的语法,并且它的优化工作。 linq提供程序也非常完整,只有它可能会比你期望的更频繁地回归到linq-to-objects。
此外,linq提供程序在项目文件夹中包含某些dll非常重要。这些取决于版本。如果您是using builds >= 14204,请确保{app}文件夹中有Mono.Reflection.dll
。
对于旧版本,必须存在以下所有内容:
Db4obects.Db4o.Instrumentation.dll
Db4objects.Db4o.NativeQueries.dll
Mono.Cecil.dll
Cecil.FlowAnalysis.dll
请注意,对于本机查询,即使在较新的版本中,这些仍然是必需的。
答案 1 :(得分:1)
看起来db4o使用自己的查询,Versant调用Native Queries(注意:.Net和Java native queries有单独的语法)。类似的东西:
IObjectContainer container = Database();
container.Query(delegate(Foo foo) {
return foo.id == id;
});
container.Query(delegate(Foo foo) {
return foo.id == id;
},
delegate(Foo foo) {
return range.IsIn(foo.time);
});