linq到Db4o没有使用索引

Yan*_*ann 5 linq performance db4o

我正在尝试db4o,并且在使用linq到db4o时性能不佳.(使用7.12)

这是我的配置:

        var configuration = Db4oFactory.Configure();
        configuration.ObjectClass(typeof(MyTest)).ObjectField("MyInt").Indexed(true);
Run Code Online (Sandbox Code Playgroud)

这是我想要保存的对象:

public class MyTest
{
    public int MyInt;
}
Run Code Online (Sandbox Code Playgroud)

这是我使用linq到db4o的代码(响应时间650ms):

var test = (from c in repo.ObjectContainer.Query<MyTest>()
                        where c.MyInt == 6500
                        select c).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

使用本机API的相同请求(响应时间28ms):

var query = repo.ObjectContainer.Query();
query.Descend("MyTest");
query.Descend("MyInt").Constrain(6500)
Run Code Online (Sandbox Code Playgroud)

有人能告诉我linq到db4o有什么问题吗?

谢谢

Gam*_*lor 9

我假设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();
Run Code Online (Sandbox Code Playgroud)