2010-02-12 30 views
5

db4o çalışıyorum ve linq to db4o kullanırken kötü performans yaşıyorum. İşte linq to Db4o endeks kullanılmıyor

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

i kurtarmaya çalışıyorum nesnedir: Burada

benim yapılandırma (7.12 kullanarak)

public class MyTest 
{ 
    public int MyInt; 
} 

Ve burada benim kod db4o için linq kullanıyor (tepki süresi 650ms):

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

ve yerel bir API kullanarak aynı isteği (yanıt süresi 28ms):

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

Birisi bana db4o linq ile ilgili sorunun ne olduğunu söyleyebilir mi?

Teşekkür

cevap

9

Ben repo.ObjectContainer-mülkiyet hakkı, IObjectContainer örnekli olduğunu varsayalım?

Dizinin kullanılmamasının nedeni, db4o-LINQ-Provider ürününü değil, LINQ to Objects kullanıyor olmanızdır.

IObjectContainer.Query() yöntemi, tüm MyTest örneklerini veritabanından alır. Ve sonra tüm bu örneklerde bir LINQ to Object sorgusu çalıştırırsınız. Bu yüzden endeks kullanılmıyor.

Bunu düzeltmek için db4o-LINQ-Provider'u kullanın. Projenize Db4objects.Db4o.Linq.dll-derlemesini eklediğinizden emin olun. Daha sonra IObjectContainer örneğini doğrudan sorgulayın. Bunun gibi:

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

çok teşekkürler. Bu satırı ayrıca şu yapılandırmaya ekledim: configuration.TıklamaNativeQueries (true); Ve sorgumun 3 ms içinde çalıştığını biliyorum :) – Yann