2010-02-12 55 views
5

我正在嘗試db4o,並且在使用linq到db4o時性能不佳。 (使用7.12)LINQ到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到db4o有什麼問題嗎?

感謝

回答

9

我假設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(); 
+0

非常感謝。我還在配置中添加了這一行: configuration.OptimizeNativeQueries(true); 並知道我的查詢在3ms運行:) – Yann 2010-02-14 19:15:40