2010-02-12 89 views
5

का उपयोग नहीं कर रहा है मैं db4o कोशिश कर रहा हूं और मुझे linq से db4o का उपयोग करते समय खराब प्रदर्शन हो रहा है। (7.12 का प्रयोग करके)linq से db4o इंडेक्स

यहाँ मेरी विन्यास है:

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

यहाँ वस्तु मैं बचाने के लिए कोशिश कर रहा हूँ है: db4o को LINQ का उपयोग कर मेरी कोड है

public class MyTest 
{ 
    public int MyInt; 
} 

और यहाँ (प्रतिक्रिया समय 650ms):

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

और एक ही अनुरोध देशी एपीआई का उपयोग कर (प्रतिक्रिया समय 28ms):

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

क्या कोई मुझे बता सकता है कि linq से db4o में क्या गलत है?

धन्यवाद

उत्तर

9

मुझे लगता है कि repo.ObjectContainer-संपत्ति IObjectContainer-उदाहरण के लिए, सही है?

इंडेक्स का उपयोग क्यों नहीं किया जाता है, यह है कि आप वास्तव में LINQ ऑब्जेक्ट्स का उपयोग कर रहे हैं, न कि db4o-LINQ-Provider।

विधि IObjectContainer.Query() डेटाबेस से सभी MyTest उदाहरण पुनर्प्राप्त करता है। और फिर आप इन सभी मामलों पर एक LINQ ऑब्जेक्ट क्वेरी चलाते हैं। तो क्यों सूचकांक का उपयोग नहीं किया जाता है।

इसे ठीक करने के लिए, db4o-LINQ-Provider का उपयोग करें। सुनिश्चित करें कि आपने अपनी परियोजना में Db4objects.Db4o.Linq.dll-assembly को जोड़ा है। फिर एक IObjectContainer-instance सीधे पूछताछ करें। इस तरह:

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

बहुत बहुत धन्यवाद। मैंने कॉन्फ़िगरेशन में यह लाइन भी जोड़ा: कॉन्फ़िगरेशन। ऑप्टिमाइज़नेटिवक्व्यूरीज़ (सत्य); और मेरी क्वेरी 3ms में चलाएं :) – Yann