2011-05-27 15 views
15

आइए कहें कि मेरे पास ऑब्जेक्ट्स की एक श्रृंखला है जो कुल मिलाकर है।मैं डैपर का उपयोग करके कुशलतापूर्वक एक समग्र वस्तु का चयन कैसे करूं?

public class C{ 
public string Details {get;set;} 
} 

public class B{ 
    public string Details {get;set;} 
    public List<C> Items {get;set;} 
} 

public class A{ 
    public long ID {get;set;} 
    public string Details {get;set;} 
    public List<B> Items {get;set;} 
} 

डैप्पर उपयोग करते हुए, सबसे अच्छा तरीका है एक डेटाबेस में तालिकाओं से इन पॉप्युलेट करने के लिए क्या है (मेरे मामले में यह postgres है, लेकिन है कि कोई फर्क नहीं होना चाहिए)। उदाहरण में टेबल ऑब्जेक्ट मॉडल के साथ एक के लिए बहुत अधिक हैं। प्रत्येक अधीनस्थ वस्तु के लिए विदेशी कुंजी संबंधों का प्रतिनिधित्व करने वाले वर्ग पर आइटम संपत्ति। यानी 3 टेबल, ए के पास बी के साथ कई रिश्तों में से एक है, बी के पास सी

इसलिए एक दिए गए आईडी के लिए मैं चाहता हूं कि मेरी ऑब्जेक्ट्स में उनके सभी बच्चे के डेटा भी हों।

मेरा सबसे अच्छा अनुमान यह है कि मुझे किसी भी तरह QueryMultiple का उपयोग करना चाहिए, लेकिन मुझे यकीन नहीं है कि इसे कैसे करना है।

+0

शायद 'क्वेरी बहुउद्देशीय' विधि? मैंने अभी डैपर डाउनलोड किया है .. मान लीजिए कि आप 'डैपर-डॉट-नेट' का जिक्र कर रहे हैं। – IAbstract

+0

याप डैपर-डॉट-नेट वह है जिसका मैं प्रयोग कर रहा हूं। – Peter

+0

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

उत्तर

11

मुझे लगता है कि सहायक मैं यहां प्रस्तावित करता हूं: Multi-Mapper to create object hierarchy सहायता का हो सकता है।

var mapped = cnn.QueryMultiple(sql) 
    .Map<A,B,A> 
    (
     A => A.ID, 
     B => B.AID, 
     a, bees => { A.Items = bees}; 
    ); 

मान लिया जाये कि आप अपने GridReader का विस्तार करने और एक नक्शाकार साथ:

public static IEnumerable<TFirst> Map<TFirst, TSecond, TKey> 
    (
    this GridReader reader, 
    Func<TFirst, TKey> firstKey, 
    Func<TSecond, TKey> secondKey, 
    Action<TFirst, IEnumerable<TSecond>> addChildren 
    ) 
{ 
    var first = reader.Read<TFirst>().ToList(); 
    var childMap = reader 
     .Read<TSecond>() 
     .GroupBy(s => secondKey(s)) 
     .ToDictionary(g => g.Key, g => g.AsEnumerable()); 

    foreach (var item in first) 
    { 
     IEnumerable<TSecond> children; 
     if(childMap.TryGetValue(firstKey(item), out children)) 
     { 
      addChildren(item,children); 
     } 
    } 

    return first; 
} 

आप एक 3 स्तरीय पदानुक्रम के साथ काम करने के लिए इस प्रतिमान विस्तृत सकता है।

+0

यह एक अच्छा समाधान है, धन्यवाद – Peter

+1

यह मेरे लिए काम नहीं करता है। जब यह टीएसकॉन्ड पढ़ने की कोशिश करता है, पाठक का उपभोग किया जाता है और इसे फिर से नहीं पढ़ा जा सकता है। –

+0

@ एमआर ग्रोक - मैं भी। क्या आपको इसका समाधान मिला? – BZink

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

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