2013-04-26 12 views
5

मेरे डेटाबेस में दो टेबल हैं: TPM_AREAS और TPM_WORKGROUPS। इन दो तालिकाओं के बीच कई से अधिक संबंध मौजूद हैं, और इन संबंधों को TPM_AREAWORKGROUPS नामक तालिका में संग्रहीत किया जाता है। इस तालिका में इस तरह दिखता है:क्या दो संस्थाओं के बीच हर संबंध प्राप्त करने का कोई त्वरित तरीका है?

enter image description here

मैं क्या करने की जरूरत स्मृति में एक ही बार में इन सभी मैपिंग लोड उनका जल्द से जल्द संभव है। TPM_AREAWORKGROUPS एक संघ है के रूप में, मैं सिर्फ यह नहीं कह सकते:

var foo = (from aw in context.TPM_AREAWORKGROUPS select aw); 

मैं तीन तरीके संभवतः यह करने के लिए के बारे में सोच सकता है, लेकिन मैं काफी यकीन है कि उनमें से प्रत्येक को पूरा करने के लिए कैसे नहीं हूँ और न ही जो एक है सबसे अच्छा।

1) जुड़े क्षेत्रों सहित हर कार्यसमूह, में लोड:

कुछ की तरह:

var allWG = (from w in context.TPM_WORKGROUPS.Include("TPM_AREAS") 
      where w.TPM_AREAS.Count > 0 
      select w); 
// Loop through this enumeration and manually build a mapping of distinct AREAID/WORKGROUPID combinations. 

लाभ: यह शायद काम करने के मानक EntityFramework तरीका है, और की आवश्यकता नहीं है मुझे किसी भी डेटाबेस संरचना या मैपिंग को बदलने के लिए।

विपक्ष: संभावित रूप से धीमा हो सकता है, क्योंकि TPM_WORKGROUPS तालिका अपेक्षाकृत बड़ी है और TPM_AREAWORKGROUPS तालिका में केवल 13 पंक्तियां हैं। इसके अलावा, TPM_AREAWORKGROUPS कक्षा नहीं है, इसलिए मुझे टुपल्स का संग्रह वापस करना होगा या इसके लिए एक नई कक्षा बनाना होगा।

2) आदर्श रूप में अपने मॉडल

बदलें, मैं एक TPM_AREAWORKGROUP वर्ग, और एक context.TPM_AREAWORKGROUP संपत्ति चाहते हैं। मैंने इस मॉडल को सीधे डेटाबेस से बनाने के लिए डिज़ाइनर का उपयोग किया, इसलिए मुझे पूरा यकीन नहीं है कि बल यह एसोसिएशन वास्तविक मॉडल होने के लिए कैसे है। क्या इसे करने का कोई आसान तरीका है?

पेशेवर: यह मुझे कोड की एक पंक्ति में किए गए इस तालिका के खिलाफ सीधे चयन करने की अनुमति देगा। वाह!

विपक्ष: मुझे अपना मॉडल बदलने के लिए मजबूर करता है, लेकिन क्या यह एक बुरी बात है?

3) इसे स्क्रू करें, कच्चे एसक्यूएल का उपयोग करें जो मैं चाहता हूं।

मुझे संदर्भ की StoreConnection संपत्ति मिल सकती है, और सीधे CreateCommand() पर कॉल करें। मैं बस कर सकता हूं:

using (DbCommand cmd = conn.CreateCommand()) 
{ 
    cmd.CommandText = "SELECT AreaId, WorkgroupId FROM TPM_AREAWORKGROUPS"; 
    var reader = cmd.ExecuteReader(); 
    // Loop through and get each mapping 
} 

पेशेवर: तेज़, आसान, मुझे मेरे मॉडल को बदलने की आवश्यकता नहीं है।

विपक्ष: हैकी की तरह लगता है। प्रोजेक्ट में कहीं और, हम मानक इकाई फ्रेमवर्क कोड का उपयोग कर रहे हैं, इसलिए यह मानक से विचलित हो जाता है। इसके अलावा, यह पहले विकल्प के समान मुद्दे हैं; अभी भी TPM_AREAWORKGROUPS कक्षा नहीं है।

प्रश्न: इस समस्या के लिए सबसे अच्छा समाधान क्या है?

आदर्श रूप में, मैं # 2 करना चाहता हूं हालांकि मुझे पूरा यकीन नहीं है कि मेरे मॉडल को कैसे समायोजित किया जाए। या, शायद कोई मेरे तीन विकल्पों की तुलना में बेहतर तरीके से जानता है।

उत्तर

3

आप कर सकता है:

var result = context 
    .TPM_WORKGROUPS 
    .SelectMany(z => z.TPM_AREAS.Select(z2 => new 
        { 
         z2.AREAID, 
         z.WORKGROUPID 
        })); 

अनुवाद एसक्यूएल एक सरल SELECT AREAID, WORKGROUPID FROM TPM_AREAWORKGROUPS हो जाएगा।

अन्य विकल्पों के बारे में:

  • मैं विकल्प 3 का उपयोग नहीं होता है), क्योंकि मैं personnally जितना संभव हो उतना कच्चे एसक्यूएल बचने के लिए जब इकाई की रूपरेखा का उपयोग कर (कुछ कारणों के लिए https://stackoverflow.com/a/8880157/870604 देखें)।

  • मैं विकल्प 2 का उपयोग नहीं करता) क्योंकि आपको अपना मॉडल बदलना होगा, और एक सरल और कुशल तरीका है जो को बदलने की अनुमति देता है।

+0

आह, यह पहला विकल्प का एक बड़ा कार्यान्वयन है। मुझे लगता है कि यह स्वीकार्य उत्तर होने के समाप्त हो जाएगा .. –

+0

@ माइक क्रिस्टेनसेन मैंने अन्य 2 विकल्पों के बारे में कुछ टिप्पणियां प्रदान करने के लिए उत्तर संपादित किया। मैं वास्तव में LINQ का उपयोग अपने वर्तमान मॉडल के साथ इकाइयों में करूँगा। – ken2k

0

डेटा लोड करने के लिए उपयोग प्रक्षेपण के बारे में क्या?

आप ऐसा कर सकते हैं जो एक अनाम वस्तु भरें और फिर जिस तरह से आप चाहें उसके साथ काम करें।

+0

कोड नमूना कृपया? –

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

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