5

db4o を試していますが、linq to 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();

ネイティブ API を使用した同じリクエスト (応答時間 28ms):

var query = repo.ObjectContainer.Query();
query.Descend("MyTest");
query.Descend("MyInt").Constrain(6500)

linq to db4o の何が問題なのか誰か教えてもらえますか?

ありがとう

4

1 に答える 1

9

repo.ObjectContainer-property は IObjectContainer-instance だと思いますよね?

インデックスが使用されない理由は、実際には db4o-LINQ-Provider ではなく LINQ to Objects を使用しているためです。

メソッド IObjectContainer.Query() は、データベースからすべての MyTest インスタンスを取得します。次に、このすべてのインスタンスに対して LINQ to Object クエリを実行します。そのため、インデックスが使用されていません。

これを修正するには、db4o-LINQ-Provider を使用します。プロジェクトに Db4objects.Db4o.Linq.dll-assembly を追加したことを確認します。次に、IObjectContainer-instance を直接クエリします。このような:

    var test = (from MyTest c in repo.ObjectContainer
                    where c.MyInt == 6500
                    select c).FirstOrDefault();
于 2010-02-13T15:19:47.797 に答える