2011-01-26 5 views
13

में "ThenFetch" के विकल्प मैं LINQ प्रदाता और क्वेरीओवर दोनों के साथ NHibernate 3.0 का उपयोग कर रहा हूं। कभी-कभी मैं भार से संबंधित डेटा उत्सुक करना चाहता हूं, और LINQ और QueryOver दोनों में बचाव के लिए "Fetch" विधि आती है।NHibernate 3. QueryOver

Foo f = ...; 
f.A.B.C 

LINQ के साथ वहाँ कोई समस्या नहीं है, तो आप "श्रृंखला" विधि "ThenFetch" के साथ हासिल करेगा कर सकते हैं, अब मैं एक विशेष परिदृश्य में जहाँ मैं उत्सुक लोड करने के लिए एक संपत्ति चाहते हैं नहीं सीधे दूसरे स्तर पर, की तरह है जैसे:

var result = Session.Query<Foo>().Fetch(a => a.A).ThenFetch(b => b.B).ThenFetch(c => c.C).ToList(); 

क्वेरी में कोई ऐसी विधि नहीं है, तो मैं एक ही परिणाम कैसे प्राप्त कर सकता हूं?

अग्रिम धन्यवाद।

उत्तर

16

साथ मैं वास्तव में दो अलग अलग तरीकों का उपयोग कर इस समस्या को हल करने में कामयाब कर सकते हैं:

दृष्टिकोण एक:

Session.QueryOver<Foo>().Fetch(x => x.A).Fetch(x => x.A.B).Fetch(x => x.A.B.C) 

दृष्टिकोण दो:

A a = null; 
B b = null; 
C c = null; 

Session.QueryOver<Foo>() 
    .JoinAlias(x => x.A,() => a) 
    .JoinAlias(() => a.B,() => b) 
    .JoinAlias(() => b.C,() => c) 

दोनों काम (पूरी तरह से मुझे बिल्कुल यकीन नहीं है कि उनमें से एक "आंतरिक" उत्पन्न होता है और दूसरा "बाहरी" जुड़ता है)।

+0

दृष्टिकोण दो केवल एक करने के लिए एक के लिए काम करने लगता है, यह संग्रह पर विफल रहता है। – Phill

+5

मैं इसे वापस लेता हूं, यह काम करता है यदि आप संग्रह के लिए शामिल प्रकार निर्दिष्ट करते हैं, डिफ़ॉल्ट रूप से यह आंतरिक जुड़ने का प्रयास करता है। यदि आप बाएं बाहरी जुड़ते हैं तो यह पूरी तरह से काम करता है। – Phill

+0

FetchType (उत्सुक, आलसी, डिफ़ॉल्ट) Fetch() के बाद आवश्यक नहीं है? –

4

मुझे लगता है कि आपको लगता है कि JoinQueryOver

IQueryOver<Relation> actual = 
    CreateTestQueryOver<Relation>() 
    .Inner.JoinQueryOver(r => r.Related1) 
    .Left.JoinQueryOver(r => r.Related2) 
    .Right.JoinQueryOver(r => r.Related3) 
    .Full.JoinQueryOver(r => r.Related4) 
    .JoinQueryOver(r => r.Collection1,() => collection1Alias) 
    .Left.JoinQueryOver(r => r.Collection2,() => collection2Alias) 
    .Right.JoinQueryOver(r => r.Collection3) 
    .Full.JoinQueryOver(r => r.People,() => personAlias); 
16

बस एक जिज्ञासा के रूप में, मैं जबाब वे मेरे NHibernate Jira पर दे दी है पोस्ट करेंगे:

query 
    .Fetch(p => p.B) 
    .Fetch(p => p.B.C) // if B is not a collection ... or 
    .Fetch(p => p.B[0].C) // if B is a collection ... or 
    .Fetch(p => p.B.First().C) // if B is an IEnumerable (using .First() extension method) 
+0

धन्यवाद! यह वास्तव में उपयोग करने के लिए आवश्यक उपयोग था। – adamjcooper