我有一个带有 Guid 作为字段的简单对象public Guid _id
,该字段被索引。
config.Common.ObjectClass(typeof(ConfigurableObject))
.ObjectField("_id").Indexed(true);
当我在 ObjectManager Enterprise 中打开数据库文件时,它显示该字段已编入索引!
但是我的查询非常慢。最多需要5个!!秒,数据库中只有大约 50 个对象。
这是查询:
private void FindObject<T>(T toFind) where T : ConfigurableObject {
var query = HeatingSystem.Instance.GetObjectContainer().Query();
query.Constrain(typeof(T));
query.Descend("_id").Constrain(toFind._id);
IObjectSet result = query.Execute();
/*IList<T> result = HeatingSystem.Instance.GetObjectContainer().Query<T>(
delegate(T cobj) {
return cobj._id == toFind.Guid;
}
);*/
}
本机和 SODA 查询都很慢。
当我添加一个
config.Common.Diagnostic.AddListener(
new Db4objects.Db4o.Diagnostic.DiagnosticToConsole());
它说“考虑您查询的索引字段”。
并且:“无法从字段索引加载查询候选集”
我将 db4o 7.12.132.14217 用于 Compactframework 2.0
编辑:
带有指导字段的类:
public abstract class ConfigurableObject {
private string _description;
public Guid _id;
}
这是完整的配置
public static IEmbeddedConfiguration ConfigDb4O() {
IEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration();
config.Common.OptimizeNativeQueries = true;
config.Common.ObjectClass(typeof(ConfigurableObject)).ObjectField("_id").Indexed(true);
config.Common.ObjectClass(typeof(ConfigurableObject)).StoreTransientFields(false);
return config;
}
我使用以下内容创建/打开数据库:
IObjectContainer db = Db4oEmbedded.OpenFile(ConfigDb4O(), "foo.db4o");