我正在尝试db4o,使用linq到db4o时性能很差。 (使用7.12)
这是我的配置:
var configuration = Db4oFactory.Configure();
configuration.ObjectClass(typeof(MyTest)).ObjectField("MyInt").Indexed(true);
这是我要保存的对象:
public class MyTest
{
public int MyInt;
}
这是我使用linq到db4o的代码(响应时间650ms):
var test = (from c in repo.ObjectContainer.Query<MyTest>()
where c.MyInt == 6500
select c).FirstOrDefault();
和相同的请求使用 native API(响应时间28ms):
var query = repo.ObjectContainer.Query();
query.Descend("MyTest");
query.Descend("MyInt").Constrain(6500)
有人可以告诉我linq to db4o怎么了吗?
谢谢
最佳答案
我假设repo.ObjectContainer-property是IObjectContainer-instance,对吗?
不使用索引的原因是,您实际上是在使用LINQ to Objects,而不是db4o-LINQ-Provider。
IObjectContainer.Query()方法从数据库中检索所有MyTest实例。然后,您在所有这些实例上运行LINQ to Object查询。因此,为什么不使用索引。
要解决此问题,请使用db4o-LINQ-Provider。确保已将Db4objects.Db4o.Linq.dll程序集添加到项目中。然后直接查询IObjectContainer-instance。像这样:
var test = (from MyTest c in repo.ObjectContainer
where c.MyInt == 6500
select c).FirstOrDefault();
关于linq to Db4o不使用索引,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2253295/