linq к Db4o, не используя индекс

Я пробую 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 (время отклика 650 мс):

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

И тот же запрос с помощью встроенного API (время отклика 28 мс):

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

Кто-то может сказать мне что случилось с linq к db4o?

Спасибо

5
задан Yann 12 February 2010 в 16:25
поделиться

1 ответ

Я предполагаю, что свойство repo.ObjectContainer является экземпляром IObjectContainer, верно?

Причина, по которой индекс не используется, заключается в том, что вы фактически используете LINQ to Objects, а не db4o-LINQ-Provider.

Метод IObjectContainer.Query () извлекает все экземпляры MyTest из базы данных. Затем вы запускаете запрос LINQ to Object для всех этих экземпляров. Вот почему индекс не используется.

Чтобы исправить это, используйте db4o-LINQ-Provider . Убедитесь, что вы добавили в проект сборку Db4objects.Db4o.Linq.dll. Затем запросите экземпляр IObjectContainer напрямую. Как это:

    var test = (from MyTest c in repo.ObjectContainer
                    where c.MyInt == 6500
                    select c).FirstOrDefault();
9
ответ дан 14 December 2019 в 01:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: