2010-02-12 3 views
5

Я пытаюсь db4o, и у меня плохая производительность при использовании linq для db4o. (С использованием 7.12)linq to Db4o не использует индекс

Вот моя конфигурация:

 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?

Благодаря

ответ

9

Я полагаю, что repo.ObjectContainer-свойство является IObjectContainer инстанции, верно?

Причина, по которой индекс не используется, заключается в том, что вы используете LINQ для объектов, а не для 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(); 
+0

спасибо большое. Я также добавил эту строку в config: configuration.OptimizeNativeQueries (true); И знаю, что мой запрос выполняется в 3 мс :) – Yann

Смежные вопросы