मुझे एक इकाई फ्रेमवर्क LINQ क्वेरी बनाने में समस्या हो रही है जिसका चयन खंड गैर-ईएफ ऑब्जेक्ट्स में विधि कॉल करता है।गैर-ईएफ विधि कॉल वाले खंड का चयन करें
नीचे दिया गया कोड एक डीबीएमएस से डेटा को दूसरे डीबीएमएस पर एक अलग स्कीमा में बदलने के लिए उपयोग किए जाने वाले ऐप का हिस्सा है। नीचे दिए गए कोड में, भूमिका डीबीएमएस के लिए अपने कस्टम वर्ग से संबंधित नहीं है, और अन्य वर्गों के सभी मेरी DB स्कीमा से इकाई की रूपरेखा द्वारा उत्पन्न कर रहे:
// set up ObjectContext's for Old and new DB schemas
var New = new NewModel.NewEntities();
var Old = new OldModel.OldEntities();
// cache all Role names and IDs in the new-schema roles table into a dictionary
var newRoles = New.roles.ToDictionary(row => row.rolename, row => row.roleid);
// create a list or Role objects where Name is name in the old DB, while
// ID is the ID corresponding to that name in the new DB
var roles = from rl in Old.userrolelinks
join r in Old.roles on rl.RoleID equals r.RoleID
where rl.UserID == userId
select new Role { Name = r.RoleName, ID = newRoles[r.RoleName] };
var list = roles.ToList();
लेकिन ToList बुला मुझे इस NotSupportedException देता है:
संस्थाओं कोLINQ विधि 'Int32 get_Item (System.String)' विधि, और इस विधि को नहीं पहचानता है में अनुवाद नहीं किया जा सकता है एक दुकान अभिव्यक्ति
LINQ-to-Entities की तरह लगता है कि नाम को कुंजी के रूप में दिए गए शब्द से बाहर खींचने के लिए मेरे कॉल पर बारफिंग है। मैं स्वीकार करता हूं कि ईएफ के बारे में पर्याप्त जानकारी नहीं है यह जानने के लिए कि यह एक समस्या क्यों है।
मैं devart के dotConnect for PostgreSQL इकाई ढांचे प्रदाता का उपयोग कर रहा हूं, हालांकि मुझे लगता है कि यह एक डीबीएमएस-विशिष्ट मुद्दा नहीं है।
मैं जानता हूँ कि मैं इसे इस तरह दो प्रश्नों में अपनी क्वेरी ऊपर विभाजित करके काम करते हैं, कर सकते हैं:
var roles = from rl in Old.userrolelinks
join r in Old.roles on rl.RoleID equals r.RoleID
where rl.UserID == userId
select r;
var roles2 = from r in roles.AsEnumerable()
select new Role { Name = r.RoleName, ID = newRoles[r.RoleName] };
var list = roles2.ToList();
लेकिन अगर वहाँ था इस समस्या को हल करने के लिए एक और अधिक सुरुचिपूर्ण और/या अधिक कारगर तरीका मैं सोच रहा था आदर्श रूप से इसे दो प्रश्नों में विभाजित किए बिना।
वैसे भी, मेरे सवाल का दो भागों है:
पहले, मैं कुछ है कि इकाई की रूपरेखा दो टुकड़ों में, स्वीकार करेंगे आदर्श बंटवारे के बिना में इस LINQ क्वेरी बदल सकता है?
दूसरा, मुझे ईएफ के बारे में कुछ भी समझना अच्छा लगेगा, इसलिए मैं समझ सकता हूं कि ईएफ डीबी एक्सेस के शीर्ष पर मेरे कस्टम .NET कोड को क्यों नहीं ले सकता है। मेरे डीबीएमएस को कोई एहसास नहीं है कि डिक्शनरी क्लास पर एक विधि कैसे कॉल करें, लेकिन डीएफ से डेटा खींचने के बाद ईएफ बस उन डिक्शनरी कॉल कॉल क्यों नहीं कर सकता है? निश्चित रूप से, अगर मैं एक साथ कई ईएफ प्रश्नों को लिखना चाहता हूं और बीच में कस्टम .NET कोड डालना चाहता हूं, तो मैं असफल होने की उम्मीद करता हूं, लेकिन इस मामले में .NET कोड केवल अंत में है, तो यह एक समस्या क्यों है एफई? मुझे लगता है कि जवाब कुछ ऐसा है जैसे "उस सुविधा ने इसे ईएफ 1.0 में नहीं बनाया है" लेकिन मैं थोड़ा और स्पष्टीकरण की तलाश कर रहा हूं कि यह ईएफ 1.0 से बाहर निकलने के लिए उचित क्यों है।
लगता है जैसे मैंने LINQ से इकाइयों के स्मारकों को अधिक महत्व दिया। मैंने माना था कि एल-टू-ई एक अभिव्यक्ति वृक्ष को उस हिस्से में विघटित करने के लिए पर्याप्त स्मार्ट था जिसे डीबी संभाल सकता है, और एक अन्य भाग जिसे इसे .NET कॉल (डीबी के बाहर) का उपयोग करके हल करना था, और फिर दोनों को सिलाई करना साथ में। अगर मैं आपको सही ढंग से समझता हूं, तो आप कह रहे हैं कि एल-टू-ई वह स्मार्ट नहीं है - यह बस एसक्यूएल में अभिव्यक्ति में * सबकुछ * को बदलने की कोशिश करता है, और अगर ऐसा कुछ है तो यह परिवर्तित नहीं हो सकता है (उदाहरण के लिए चयन खंड में .NET ऑब्जेक्ट विधि पर कॉल करें), तो यह निष्पादित करने में विफल रहेगा? –
यह जस्टिन सही है। नोट: स्वचालित रूप से सभी स्तरों पर एक क्वेरी को विच्छेदन करना, एक 'वितरित क्वेरी' है, जो आम तौर पर हल करने के लिए एक अविश्वसनीय रूप से कठिन समस्या है। –
दाएं। LINQ से इकाइयों में सब कुछ एक अभिव्यक्ति वृक्ष के रूप में होता है जो अंततः डेटाबेस के खिलाफ उपयोग करेगा जब यह * वास्तव में * पुनरावृत्त होता है। यह उस तरह से "गूंगा" है, लेकिन ऐसा इसलिए है क्योंकि, जैसा कि एलेक्स कहता है, वितरित प्रश्न हल करने के लिए एक अविश्वसनीय रूप से कठिन समस्या है जब चीजें थोड़ा जटिल हो जाती हैं। पता है कि, हालांकि, आप डेटा को क्लाइंट को खींचने के लिए अपने बुकमार्क के रूप में पुनरावृत्ति का उपयोग कर सकते हैं। –