2009-06-02 28 views
24

के साथ उत्सुक लोडिंग बाल संग्रह मैं रूट इकाइयों को लोड करना चाहता हूं और अपने सभी बच्चे संग्रह और कुल सदस्यों को लोड करना चाहता हूं।NHibernate

FluentNHibernate में SetFetchMode का उपयोग करने का प्रयास कर रहा है, लेकिन मुझे बाल संग्रह में डुप्लीकेट मिल रहा है क्योंकि मेरे पास 3 स्तरों की गहराई है। DistinctRootEntityResultTransformer दुर्भाग्यवश केवल रूट डुप्लिकेशंस को हटा देता है।

return Session.CreateInvoiceBaseCriteria(query, archived) 
    .AddOrder(new Order(query.Order, query.OrderType == OrderType.ASC)) 
    .SetFetchMode("States", FetchMode.Eager) 
    .SetFetchMode("Attestations", FetchMode.Eager) 
    .SetFetchMode("AttestationRequests", FetchMode.Eager) 
    .SetFetchMode("AttestationRequests.Reminders", FetchMode.Eager) 
    .SetResultTransformer(new DistinctRootEntityResultTransformer()) 
    .List<Invoice>(); 

मैं बहु प्रश्नों या कुछ इसी तरह का उपयोग कर सकते हैं इस संग्रह करने के लिए?

इसके अलावा, क्या यह दृष्टिकोण डेटाबेस से अनावश्यक रूप से भारी परिणाम सेट में नहीं होगा?

कोई सुझाव?

उत्तर

0

यह नहीं हो सकता है आप के लिए, मैं इस लेख देखने की सलाह देते हैं कि वास्तव में क्या देख रहे हैं:

Eager loading aggregate with many child collections

आप उस साइट के बाकी चारों ओर देखो, तो आप और भी अधिक पदों पर चर्चा मिलेगा उत्सुक लोडिंग और अन्य महान nHibernate सामान।

+2

वास्तव में एक अच्छा लेख है, लेकिन यह सुनिश्चित नहीं है कि मैं इसे अपनी स्थिति में लागू कर सकता हूं। एक विशिष्ट रूट इकाई को लोड करने के उत्सुकता के बारे में आलेख में वर्णित समाधान, मेरी समस्या यह है कि मैं रूट इकाइयों के संग्रह को लोड करना चाहता हूं। यदि मैं मल्टीक्रिटर का उपयोग करता हूं तो मुझे एक विशिष्ट इकाई निर्दिष्ट किए बिना सभी अलग-अलग प्रश्नों को जोड़ने का एक तरीका ढूंढना होगा। सुझाव कैसे बनाया जा सकता है? – Kristoffer

+0

उस उदाहरण में केवल एक अतिरिक्त पदानुक्रम स्तर है, लेकिन कोई पोते नहीं है, जिसके लिए मल्टीक्वियर/मल्टीक्रिटरिया काफी बेकार प्रतीत होता है, क्योंकि बाद के प्रश्न पिछले प्रश्नों के परिणामों का संदर्भ नहीं दे सकते हैं (जैसे क्वेरी # 1: रूटऑब्जेक्ट्स आर का चयन करें बच्चों को लाने में शामिल हों कहां ...; प्रश्न # 2: पोते-पोते जी का चयन करें जहां सी में माता-पिता)। –

8

एक समाधान मिला लेकिन यह सुंदर नहीं है। सबसे पहले मैं जाता हूं और सभी चालान आईडी ढूंढता हूं, फिर मैं उन्हें बहुविकल्पीय में उपयोग करता हूं और अंत में परिणाम को हैशसेटसेट के माध्यम से फ़िल्टर करता हूं। बड़ी संख्या में वस्तुओं की वजह से मैं कभी-कभी मानदंड प्रतिबंध का उपयोग नहीं कर सका। इन्हें इसे स्ट्रिंग के रूप में भेजने के लिए मजबूर होना पड़ा।

कोई भी सुझाव दिया गया tweaks?

var criteria = Session.CreateInvoiceBaseCriteria(query, archived) 
    .SetProjection(Projections.Id()); 

var invoiceIds = criteria.List<int>(); 
if (invoiceIds.Count > 0) 
{ 
    var joinedIds = JoinIDs(criteria.List<int>()); // To many ids to send them as parameters. 

    var sql1 = string.Format("from Invoice i inner join fetch i.States where i.InvoiceID in ({0}) order by i.{1} {2}", joinedIds, query.Order, query.OrderType.ToString()); 
    var sql2 = string.Format("from Invoice i inner join fetch i.AttestationRequests where i.InvoiceID in ({0})", joinedIds); 
    var sql3 = string.Format("from Invoice i inner join fetch i.Attestations where i.InvoiceID in ({0})", joinedIds); 

    var invoiceQuery = Session.CreateMultiQuery() 
     .Add(sql1) 
     .Add(sql2) 
     .Add(sql3); 

    var result = invoiceQuery.List()[0]; 

    return new UniqueFilter<Invoice>((ICollection)result); 
} 

return new List<Invoice>(); 
+0

यह विषम है, प्रमाण एक ही प्रश्न के रूप में प्राप्त किए जाते हैं। – Kristoffer

+0

+1, यह वास्तव में (और दुर्भाग्य से) इसे प्राप्त करने के लिए सबसे अच्छा तरीका (प्रदर्शन-वार) है। –

+0

मैं एक समान स्थिति में हूं (एक बार में 3 स्तरों को खींचने की कोशिश कर रहा हूं)। यद्यपि आपका समाधान डुप्लिकेट से छुटकारा पाता है, यह केवल 2 स्तरों का गहरा प्रतीत होता है। आपके मूल प्रश्न में तीसरे स्तर को "AttestationRequests.Reminders" कहा जाता है जिसे आपके उत्तर में शामिल नहीं किया गया है। – MylesRip

2

अपने प्रश्न का उत्तर देने के लिए: हाँ, इसके परिणामस्वरूप बड़े परिणाम होते हैं।

मैं करने के लिए सुझाव:

  • सिर्फ भोलेपन से उत्सुक प्राप्त करने में कठिनाई
  • कुछ स्थानों पर बिना अपने प्रश्नों लिखते हैं, एक उत्सुक लाने शब्दों में कहें, लेकिन क्वेरी
  • में केवल एक यदि आप वास्तव में प्रदर्शन की समस्याओं के लिए आपको जो इंडेक्स के साथ हल नहीं कर सकते हैं या क्वेरी और मैपिंग रणनीतियों को बढ़ाकर, एकाधिक समाधानों के साथ अपने समाधान का उपयोग कर सकते हैं।