2

任何人都可以为非sql数据库查询接口设计模式提供一些参考吗?

对于基于sql的数据库,可以通过组合查询token来实现查询。但是对于非sql,如何设计查询,因为查询可能非常复杂。

编辑:

我正在使用db4o来存储一些对象,我可能需要根据某个Id,时间范围,或者它们的组合来查询。

如何设计查询方法?

public IEnumerable<Foo> GetFoos(int id);
public IEnumerable<Foo> GetFoos(int id, TimeRange range);

构建大量重载似乎很愚蠢,如果需要新查询怎么办?

4

2 回答 2

3

在 C# 中,绝对最好使用 Linq。原生查询经常无法优化,这将导致 db4o 水合所有对象并实际调用实例化对象上的 lambda 表达式。这只不过是对 linq-to-objects 的自动回退,相比之下它非常慢。仅仅为 6 万个典型物体补水就需要几秒钟。

提示:决不能调用 lambda 表达式上的断点。

即使使用Db4oTool.exe优化本地查询作为构建后步骤,在域对象中使用属性或自动属性时,即使是简单的查询也会导致问题。

linq 提供者总是给我最好的结果。它具有最简洁的语法并且它的优化工作。此外,linq 提供程序非常完整,只是它可能比您预期的更频繁地回退到 linq-to-objects。

此外,linq 提供程序在项目文件夹中具有某些 dll 也很重要。这些取决于版本。如果您使用的是 builds >= 14204,请确保Mono.Reflection.dll在您的 app 文件夹中。

对于旧版本,必须存在以下所有内容:

Db4obects.Db4o.Instrumentation.dll
Db4objects.Db4o.NativeQueries.dll
Mono.Cecil.dll
Cecil.FlowAnalysis.dll

请注意,对于本机查询,即使在较新的版本中,这些仍然是必需的。

于 2010-05-04T08:06:47.263 回答
1

看起来 db4o 使用自己的查询,Versant 将其称为Native Queries(注意:.Net 和Java 本机查询有不同的语法)。就像是:

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);
    });
于 2010-05-04T03:58:25.080 回答