2010-04-20 7 views
5

उनके पदानुक्रम डेटाप्रकार के साथ काम करने एसक्यूएल/संस्थाओं 4.0 LINQ उपयोग करने के लिए एक रास्ता है एसक्यूएल या LINQ संस्थाओं के लिए करने के लिए Linq करता है?4.0 समर्थन hierarchyid डेटाप्रकार

उत्तर

9

ओआरएम के माइक्रोसॉफ्ट परिवार में से कोई भी वर्तमान में सीएलआर उपयोगकर्ता-परिभाषित प्रकारों का उपयोग नहीं कर सकता है (जिसमें अंतर्निहित hierarchyid और भू-स्थानिक प्रकार) कॉलम प्रकार के रूप में शामिल हैं।

  1. अभिव्यक्ति CAST(hid AS varbinary892)) साथ पदानुक्रम मेज पर एक गणना स्तंभ जोड़ें:

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

    इस बिंदु पर, आप Microsoft.SqlServerTypes के लिए एक संदर्भ जोड़ने और BinaryReader/BinaryWriter वर्गों का उपयोग SqlHierarchyId से करने के लिए/ब्लॉब डेटा कन्वर्ट करने के द्वारा अपनी ही संपत्ति के रूप में "असली" hierarchyid स्तंभ जोड़ने के लिए इकाई के आंशिक वर्ग का विस्तार कर सकते हैं।

    ध्यान दें कि आप इस कॉलम के खिलाफ लिंक प्रश्न नहीं लिख सकते हैं। यदि आप कोशिश करते हैं तो आपको बस "कोई समर्थित अनुवाद" त्रुटि नहीं मिलेगी। तो ध्यान रखें कि यह सीमित वर्कअराउंड है।

  2. दूसरा विकल्प, और जिसे मैं आम तौर पर पसंद करता हूं, hierarchyid कॉलम का उपयोग L2S/EF के भीतर से नहीं करना है। पदानुक्रम तालिका में एक अलग-अनुक्रमित सरोगेट ऑटो-इंक कुंजी जोड़ें और कार्यान्वयन विवरण के रूप में hierarchyid का इलाज करें। पदानुक्रमित प्रश्नों को लागू करने के लिए यूडीएफ और दृश्यों का उपयोग करें जिन्हें केवल पैराग्राफ के रूप में सरोगेट आईडी की आवश्यकता होती है।

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

    दुर्भाग्यवश मेरे पास hierarchyid और आसन्नता सूची के बीच सही संगठनों को बनाए रखने के लिए आपको जो कुछ करने की आवश्यकता है, उसका पूर्ण कार्य उदाहरण नहीं है, लेकिन यदि आप Dennis's article पढ़ते हैं तो यह एक अच्छी शुरुआत होनी चाहिए। भौतिक मार्ग को लागू न करें, इसके बजाय hierarchyid का उपयोग करें, लेकिन ट्रिगर्स के साथ स्वयं-बनाए रखने वाले पदानुक्रमों को लागू करने के बारे में अनुभाग पढ़ें।

    यदि माइक्रोसॉफ्ट कभी भी अपने ओआरएम में hierarchyid के लिए समर्थन लागू करता है, तो आसन्नता सूची को हटाने और hierarchyid के आधार पर विशेष रूप से समाधान के लिए स्विच करना आसान होगा। लेकिन hierarchyid के आधार पर पदानुक्रमों के प्रबंधन के बाद को बनाए रखने के लिए संग्रहित प्रक्रियाओं की आवश्यकता होती है, फिर भी (चूंकि आपको "स्वचालित" आईडी नहीं मिलती हैं), आपको पदानुक्रमित प्रश्नों के आस-पास कई SQL UDFs और संग्रहीत प्रक्रिया अबास्ट्रक्शन लिखने में सहजता मिलनी चाहिए।

+0

वाह .. बहुत धन्यवाद। मैंने अभी पदानुक्रम को एक ब्लॉब में बदलने और इसे वापस पदानुक्रम में परिवर्तित करने का निर्णय लिया है। मैं शोध कर रहा हूं कि यह कैसे करें। धन्यवाद – Luke101

0

एक शब्द में, नहीं। वैसे भी, सीधे नहीं। हालांकि, आप work around it similarly to geospatial types पर सक्षम हो सकते हैं। मैंने कोशिश नहीं की है।

0

हम हारूनॉट के लिंक से एसक्यूएल के समान समाधान का उपयोग करते हैं।

हम गणना कॉलम

TreeId.ToString() 

वर्तमान hierarchyid-स्तंभ के लिए और

[TreeId].[GetAncestor](1).ToString() 
प्रत्यक्ष माता पिता के लिए

बनाने की है।

हमने एक ऐसा दृश्य भी बनाया जो पदानुक्रम-कॉलम को शामिल करता है और इस दृश्य को डीबीएमएल-आरेख पर खींचता है और संदर्भित तालिकाओं में एसोसिएशन सेट करता है।

अधिकांश पदानुक्रम-कार्यक्षमता संग्रहित प्रक्रियाओं के रूप में होने की आवश्यकता है।

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