मेरे डेटाबेस में दो टेबल हैं: TPM_AREAS
और TPM_WORKGROUPS
। इन दो तालिकाओं के बीच कई से अधिक संबंध मौजूद हैं, और इन संबंधों को TPM_AREAWORKGROUPS
नामक तालिका में संग्रहीत किया जाता है। इस तालिका में इस तरह दिखता है:क्या दो संस्थाओं के बीच हर संबंध प्राप्त करने का कोई त्वरित तरीका है?
मैं क्या करने की जरूरत स्मृति में एक ही बार में इन सभी मैपिंग लोड उनका जल्द से जल्द संभव है। 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 करना चाहता हूं हालांकि मुझे पूरा यकीन नहीं है कि मेरे मॉडल को कैसे समायोजित किया जाए। या, शायद कोई मेरे तीन विकल्पों की तुलना में बेहतर तरीके से जानता है।
आह, यह पहला विकल्प का एक बड़ा कार्यान्वयन है। मुझे लगता है कि यह स्वीकार्य उत्तर होने के समाप्त हो जाएगा .. –
@ माइक क्रिस्टेनसेन मैंने अन्य 2 विकल्पों के बारे में कुछ टिप्पणियां प्रदान करने के लिए उत्तर संपादित किया। मैं वास्तव में LINQ का उपयोग अपने वर्तमान मॉडल के साथ इकाइयों में करूँगा। – ken2k