2010-02-12 23 views
5

J'essaye db4o et j'ai de mauvaises performances quand j'utilise linq to db4o. (En utilisant 7,12)linq à Db4o n'utilisant pas l'index

Voici ma configuration:

 var configuration = Db4oFactory.Configure(); 
     configuration.ObjectClass(typeof(MyTest)).ObjectField("MyInt").Indexed(true); 

Voici l'objet que j'essaie de sauver:

public class MyTest 
{ 
    public int MyInt; 
} 

Et voici mon code en utilisant LINQ à db4o (temps de réponse 650ms):

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

Et la même demande en utilisant l'API native (temps de réponse 28ms):

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

Quelqu'un peut-il me dire ce qui ne va pas avec linq to db4o?

Merci

Répondre

9

Je suppose que la repo.ObjectContainer-propriété est la IObjectContainer instance, non?

La raison pour laquelle l'index n'est pas utilisé est que vous utilisez réellement LINQ to Objects et non le fournisseur db4o-LINQ.

La méthode IObjectContainer.Query() récupère toutes les instances MyTest de la base de données. Et puis vous exécutez une requête LINQ to Object sur toutes ces instances. Donc, pourquoi l'indice n'est pas utilisé.

Pour résoudre ce problème, utilisez le db4o-LINQ-Provider. Assurez-vous que vous avez ajouté l'assembly Db4objects.Db4o.Linq.dll à votre projet. An interroge alors l'instance IObjectContainer directement. Comme ceci:

var test = (from MyTest c in repo.ObjectContainer 
        where c.MyInt == 6500 
        select c).FirstOrDefault(); 
+0

merci beaucoup. J'ai également ajouté cette ligne dans la configuration: configuration.OptimizeNativeQueries (true); Et sachez que ma requête fonctionne en 3ms :) – Yann