2010-02-12 49 views
5

Estoy intentando db4o y estoy teniendo un mal rendimiento cuando uso linq a db4o. (Usando 7,12)linq a Db4o no usando el índice

Aquí está mi configuración:

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

Aquí es el objeto que estoy tratando de salvar:

public class MyTest 
{ 
    public int MyInt; 
} 

y aquí está mi código utilizando LINQ a db4o (tiempo de respuesta 650ms):

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

Y la misma solicitud a través de la API nativa (tiempo de respuesta de 28 ms):

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

¿Puede alguien decirme qué pasa con linq to db4o?

Gracias

Respuesta

9

que asumen que el repo.ObjectContainer-propiedad es la IObjectContainer instancia, ¿verdad?

La razón por la cual no se utiliza el índice, es que en realidad está utilizando LINQ to Objects y no el db4o-LINQ-Provider.

El método IObjectContainer.Query() recupera todas las instancias MyTest de la base de datos. Y luego ejecuta una consulta LINQ to Object en todas estas instancias. Entonces, ¿por qué el índice no se usa?

Para solucionar esto, utilice db4o-LINQ-Provider. Asegúrese de haber agregado el ensamblado Db4objects.Db4o.Linq.dll a su proyecto. Luego consulta directamente la instancia de IObjectContainer. De esta manera:

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

muchas gracias. También agregué esta línea en la configuración: configuration.OptimizeNativeQueries (true); Y sé que mi consulta se ejecuta en 3ms :) – Yann