2010-08-03 9 views
8

मैं NHibernate 3 alpha 1 का उपयोग कर बेसब्री से सभी संग्रह लोड करने के लिए कोशिश कर रहा हूँ,। मैं सोच रहा हूं कि क्या यह फिरफैच() का उपयोग करने का सही तरीका है?क्या यह एकाधिक संग्रह लोड करने के लिए ThenFetch() का उपयोग करने का सही तरीका है?

बहुवचन नाम के साथ गुण संग्रह हैं। अन्य सिर्फ एक ही वस्तु है।

  IQueryable<T> milestoneInstances = Db.Find<T, IQueryable<T>>(db => 
      from mi in db 
      where mi.RunDate == runDate 
      select mi).Fetch(mi => mi.Milestone) 
       .ThenFetch(m => m.PrimaryOwners) 
       .Fetch(mi => mi.Milestone) 
       .ThenFetch(m => m.SecondaryOwners) 
       .Fetch(mi => mi.Milestone) 
       .ThenFetch(m => m.Predecessors) 
       .Fetch(mi => mi.Milestone) 
       .ThenFetch(m => m.Function) 
       .Fetch(mi => mi.Milestone) 
       .ThenFetchMany(m => m.Jobs) 
       .ThenFetch(j => j.Source) 
       ; 

मैं Google समूह NHibernate forums लेकिन दुर्भाग्य से पहुँच में यह पूछ रहा से मैं कहाँ हूँ मना किया है के बारे में सोचा। मैं जानता हूँ कि Fabio यहाँ है, इसलिए हो सकता है NHibernate टीम की ओर से लोगों को इस पर कुछ प्रकाश डाला सकता है? धन्यवाद

उत्तर

3

एक चीज जो आप गायब हैं, वह है कि आपको FetchMany() और ThenFetchMany() का उपयोग करना चाहिए, यह एक संपत्ति है।

7

जाहिर है, वहाँ कोई "सही" जिस तरह से इस तरह के एक मामले में ThenFetch उपयोग करने के लिए है। आपका उदाहरण ठीक काम करता है लेकिन एसक्यूएल उत्पादित कई शामिल हैं Milestone, जो सही नहीं है।

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) 

तो अपने मामले में यह होगा::

का उपयोग IQueryable के बजाय IQueryOver आप उपयोग करना complex syntaxFetch में अनुमति देता है,

query // = session.QueryOver<X>() 
    .Fetch(mi => mi.Milestone).Eager 
    .Fetch(mi => mi.Milestone.PrimaryOwners).Eager 
    .Fetch(mi => mi.Milestone.SecondaryOwners).Eager 
    .Fetch(mi => mi.Milestone.Predecessors).Eager 
    .Fetch(mi => mi.Milestone.Function).Eager 
    .Fetch(mi => mi.Milestone.Jobs).Eager 
    .Fetch(mi => mi.Milestone.Jobs.First().Source).Eager 
+0

+1, विश्वास नहीं कर सकता यह वास्तव में काम करता है। धन्यवाद। –

0

Leora के रूप में कहा कि जब बच्चों संग्रह प्राप्त करने में कठिनाई यह सुनिश्चित कर लें कि आप का उपयोग

FetchMany() 

ThenFetchMany() 

एक नया Fetch, रूट से उठा लेना चाहिए, लेकिन यह हमेशा नहीं होता है। कभी-कभी आपको उन्हें अलग-अलग प्रश्नों के रूप में बनाने या एकाधिक फ़ेच बैच करने के लिए मानदंड फ़्यूचर्स का उपयोग करने की आवश्यकता होती है।

0
 IQueryable<T> milestoneInstances = Db.Find<T, IQueryable<T>>(db => 
     from mi in db 
     where mi.RunDate == runDate 
     select mi); 

var fetch = milestoneInstances.Fetch(f => f.Milestone); 
fetch.ThenFetch(f => f.PrimaryOwners); 
fetch.ThenFetch(f => f.SecondaryOwners); 
//... 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^