2010-05-17 16 views
7

को IEnumerable कन्वर्ट, और शायद इस मुद्दे को मैं आ रही करने के लिए एक संभव समाधान ...उम्मीद किसी को कुछ प्रकाश डाला सकता है EntitySet

मैं एसक्यूएल करने के लिए LINQ का इस्तेमाल किया है स्थानीय संस्थाओं में किसी डेटाबेस से कुछ डेटा खींचने के लिए। वे एक शॉपिंग कार्ट सिस्टम से उत्पाद हैं। किसी उत्पाद में किट ग्रुप का संग्रह हो सकता है (जो एंटीटीसेट (System.Data.Linq.EntitySet) में संग्रहीत होते हैं। किट ग्रुप में किटइटम के संग्रह होते हैं, और किट इटम्स में नेस्ड प्रोडक्ट्स (जो मूल उत्पाद प्रकार तक बैक अप लेता है) पुनरावर्ती)

इन संस्थाओं मैं एक्सएमएल के लिए LINQ का उपयोग कर एक्सएमएल निर्माण कर रहा हूँ से -। सब यहाँ अच्छा -।। मेरी एक्सएमएल, सुंदर लग रहा है एक "GenerateProductElement" समारोह है, जो खुद रिकर्सिवली नेस्टेड उत्पादों उत्पन्न करने के लिए कहता है बुला अद्भुत सामान

हालांकि, यहां मैं कहां फंस गया हूं .. अब मैं उस एक्सएमएल को मूल वस्तुओं (सभी लिंकक से एसक्यूएल द्वारा स्वत: उत्पन्न) पर deserialize करने की कोशिश कर रहा हूं ... और यहां समस्या निहित है। लिंक टीओ एसक्यूएल मेरे संग्रह की अपेक्षा करता है EntitySet संग्रह होने के लिए, हालांकि लिंक से एक्सएमएल (जो मैं tyr हूँ deserailise करने के लिए उपयोग करने के लिए आईएनएनमेरेबल लौट रहा है।

मैंने 2 के बीच कास्टिंग के कुछ तरीकों से प्रयोग किया है, लेकिन कुछ भी काम नहीं करता है ... मुझे लगता है कि मुझे लगता है कि मुझे मैन्युअल रूप से deserialise करना चाहिए (कुछ फंकी लूप और सशर्त के साथ यह निर्धारित करने के लिए कि किट समूह समूह किटम्स से संबंधित हैं, आदि) ... हालांकि यह वास्तव में काफी मुश्किल है और यह कोड काफी बदसूरत होने की संभावना है, इसलिए मुझे इस समस्या का एक और अधिक शानदार समाधान मिलना अच्छा लगेगा।

कोई सुझाव?

कोड स्निपेट है:

private Product GenerateProductFromXML(XDocument inDoc) 
{ 
    var prod = from p in inDoc.Descendants("Product") 
     select new Product 
     { 
      ProductID = (int)p.Attribute("ID"), 
      ProductGUID = (Guid)p.Attribute("GUID"), 
      Name = (string)p.Element("Name"), 
      Summary = (string)p.Element("Summary"), 
      Description = (string)p.Element("Description"), 
      SEName = (string)p.Element("SEName"), 
      SETitle = (string)p.Element("SETitle"), 
      XmlPackage = (string)p.Element("XmlPackage"), 
      IsAKit = (byte)(int)p.Element("IsAKit"), 
      ExtensionData = (string)p.Element("ExtensionData"), 
     }; 

    //TODO: UUGGGGGGG Converting b/w IEnumerable & EntitySet 
    var kitGroups = (from kg in inDoc.Descendants("KitGroups").Elements("KitGroup") 
        select new KitGroup 
           { 
            KitGroupID = (int) kg.Attribute("ID"), 
            KitGroupGUID = (Guid) kg.Attribute("GUID"), 
            Name = (string) kg.Element("Name"), 
            KitItems = // THIS IS WHERE IT FAILS - "Cannot convert source type IEnumerable to target type EntitySet..." 
             (from ki in kg.Descendants("KitItems").Elements("KitItem") 
             select new KitItem 
                { 
                 KitItemID = (int) ki.Attribute("ID"), 
                 KitItemGUID = (Guid) ki.Attribute("GUID") 
                }); 
           }); 

    Product ImportedProduct = prod.First(); 

    ImportedProduct.KitGroups = new EntitySet<KitGroup>(); 
    ImportedProduct.KitGroups.AddRange(kitGroups); 

    return ImportedProduct; 
} 
enter code here 

मैं जोड़ने चाहिए एसक्यूएल करने के लिए कि सभी संस्थाओं यहाँ उल्लेख (उत्पाद, KitGroup, KitItem, आदि) Linq से उत्पन्न कर रहे हैं - किसी भी अन्य संस्थाओं के लिए वापस नहीं मानचित्रण के साथ (शॉपिंग कार्ट इकाइयों का उपयोग नहीं करता है, इसलिए वे इस संदर्भ में केवल एक्सएमएल और डेटाबेस से सीरियल/deserialise के साधन के रूप में मौजूद हैं। मैं जिस कार्यक्षमता का निर्माण कर रहा हूं वह अपने सभी किट ग्रुप, किट इटम्स और उत्पाद के साथ एक उत्पाद निर्यात करने की क्षमता है। एक पर्यावरण से घोंसला वाले उत्पादों, और दूसरे में आयात करें।

उत्तर

17

निम्नलिखित लिंक उपयोगी खोजें।

http://social.msdn.microsoft.com/Forums/en-US/linqprojectgeneral/thread/58c4dcf8-2d89-4a3c-bb30-58c7c15df04b


संपादित करें: मामले ऊपर के लिंक कभी टूट जाता है, समाधान एक विस्तार विधि

public static EntitySet<T> ToEntitySet<T> (this IEnumerable<T> source) where T : class 
{ 
    var es = new EntitySet<T>(); 
    es.AddRange (source); 
    return es; 
} 

Subquery तो उपयोग कर सकते हैं .ToEntitySet()

... 
(from ki in kg.Descendants("KitItems").Elements("KitItem") 
select new KitItem 
{ 
    KitItemID = (int) ki.Attribute("ID"), 
    KitItemGUID = (Guid) ki.Attribute("GUID") 
}).ToEntitySet(); 
... 
+0

आह हाँ बनाने के लिए है, यही वही है जो मैं बाद में था ... धन्यवाद जेनल! – Jeeby

+0

ने भी मेरी मदद की, धन्यवाद! –

+0

धन्यवाद दोस्त, आपने मुझे बचाया। मैं उम्र के बाद से एक ही मुद्दे के साथ संघर्ष कर रहा हूँ ... –

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