तो, मेरे पास यह नई परियोजना है। मेरी कंपनी SalesForce.com क्लाउड का उपयोग दिन-प्रतिदिन के संचालन के बारे में जानकारी संग्रहीत करने के लिए करती है। मेरा काम एक नया एप्लीकेशन लिखना है जो अन्य चीजों के साथ, इस डेटा के सीआरयूडी संचालन को मौजूदा इन-हाउस एप्लिकेशन कार्यक्षमता के साथ एकीकृत रूप से एकीकृत करेगा।लिंक से सेल्सफोर्स "एसक्यूएल" प्रदाता
सेल्सफोर्स डब्लूएसडीएल एपीआई का दिल "क्वेरी()" वेब विधियों का एक सेट है जो क्वेरी कमांड को एक स्ट्रिंग के रूप में लेता है। क्वेरी का सिंटैक्स एसक्यूएल-आईएसएच है, लेकिन काफी नहीं है (वे इसे SOQL कहते हैं)। मैं "जादू तार" का प्रशंसक नहीं हूं, इसलिए मैं कोडकैस में लिंक का उपयोग करना चाहता हूं, और IQueryable को एसओक्यूएल क्वेरी में पार्स करना चाहता हूं जो मुझे सेवा के लिए रैपर में चाहिए। यह निश्चित रूप से संभव है (एल 2 ई, एल 2 एसक्यूएल), लेकिन मैं जानना चाहता हूं कि शॉर्टकट है या नहीं, 'अगर मैं कहता हूं कि इसे अपने आप को रोल करने के लिए एक या दो दिन से ज्यादा समय लगेगा, तो मुझे ढूंढने के लिए "प्रोत्साहित किया जाएगा" एक अन्य विधि (संभवतः प्रत्येक सामान्य उपयोग क्वेरी के लिए एक विधि, जो पुराने ऐप्स में उपयोग की जाने वाली विधि थी)। यदि मैं एक सामान्य उद्देश्य SOQL पार्सर बनाने में सफल होता हूं, तो हम इसे कई अन्य आगामी ऐप्स में उपयोग कर सकते हैं, और मैं नायक बनूंगा। यहां तक कि यदि मैं एक साधारण व्यक्ति बनाता हूं जो केवल कुछ क्वेरी संरचनाओं का समर्थन करता है, तो यह मुझे एक परियोजना के साथ एक लिंक-वाई तरीके से आगे बढ़ने की अनुमति देकर लंबा सफर तय करेगा, और मैं इसे अपने खाली समय में विस्तारित कर सकता हूं।
यहाँ विकल्प हैं के रूप में मैं इसे देख:
- देखो एक मौजूदा Linq2SOQL प्रदाता के लिए कठिन (मेरा गूगल फू किसी और वहाँ बस मुझे यहाँ नाकाम रहने के है, या एक नहीं है, केवल .NET आवरण केवल लिनक को एक अच्छा के रूप में उल्लेख करता है)।
- अभिव्यक्ति वृक्ष पार्सर बनाएं। इसे कम से कम, चयन और कहां विधि कॉल करने के लिए समर्थन करने की आवश्यकता है, और ऑपरेशन और अनुमानों की आवश्यकता के लिए लैम्बडास को पार्स या उनके विधि निकायों में हेरफेर करने की आवश्यकता है। यह एक बड़ा काम है, लेकिन जैसा कि मैंने कहा, यह निश्चित रूप से संभव है।
- लिंक 2 एसक्यूएल या इसी तरह के मौजूदा लिंक प्रदाता में सेवा लपेटें जो मुझे एक करीबी पर्याप्त क्वेरी स्ट्रिंग निकालने, इसे पॉलिश करने और इसे सेवा में पास करने की अनुमति देगा। वहाँ दर्जनों होना चाहिए (हालांकि कोई भी जो अभी छोड़ता है, AFAIK)।
- कॉल अभिव्यक्ति। टोस्टिंग() (या अभिव्यक्ति.डिबग व्यू), और एसओक्यूएल क्वेरी बनाने के लिए उस स्ट्रिंग में हेरफेर करें। यह भंगुर होगा, यह बदसूरत (दृश्यों के पीछे) होगा, और यह केवल वही समर्थन करेगा जो मैं स्पष्ट रूप से ढूंढ रहा हूं, लेकिन यह एक प्राथमिक अनुवाद प्रदान करेगा जो मुझे आगे बढ़ने की अनुमति देगा।
आप क्या सोचते हैं? एक लड़के के लिए दो दिन के काम से अधिक एक लिंक पार्सर का निर्माण कर रहा है? एक मौजूदा लिंक प्रदाता से जुड़े एक हलचल समाधान संभवतः यह करेंगे? अभिव्यक्ति स्ट्रिंग को काटकर और मेरी क्वेरी को इस तरह से बनाने के लिए भयानक होगा?
संपादित करें: ग्राउंडिंग के लिए किर्क के लिए धन्यवाद। मैंने कुछ और अधिक देखा कि मुझे एक बुनियादी एसओक्यूएल पार्सर के लिए क्या करना होगा, और यह किसी भी व्यवहार्य अनुसूची पर लिखे गए वर्किंग कोड कोड के दायरे से बाहर है। उदाहरण के लिए, मुझे चयन() विधि लैम्ब्डा या मेरी डब्लूएसडीएल ऑब्जेक्ट से सभी ज्ञात कॉलम से एक डिफ़ॉल्ट सूची से एक चयन सूची बनाना है, एक ऐसा कार्य जिसे मैंने नहीं सोचा था (मैं जहां पार्सिंग पर अधिक ध्यान केंद्रित कर रहा था) । मुझे यकीन है कि कई अन्य "अज्ञात अज्ञात" हैं जो इसे एक बहुत बड़े सौदे में बदल सकते हैं। मुझे कई लिंक मिले जो एक लिंक प्रदाता लिखने की मूल बातें दिखाते हैं, और हालांकि वे सभी इसे सरल बनाने की कोशिश करते हैं, यह अभी समय-समय पर व्यवहार्य नहीं होगा। मैं अपने भंडार को ढूढ़ूंगा, अब नामित विधियों का उपयोग करके नामित प्रश्नों को समाहित करता हूं (स्वरूपण क्वेरी स्ट्रिंग्स की निरंतर श्रेणी को रखरखाव में सिर-खरोंच की मात्रा को कम करना चाहिए)। सही नहीं है, लेकिन कहीं अधिक व्यवहार्य है। यदि और जब एक Linq2SOQL प्रदाता जमीन से उतरता है, या तो इन-हाउस या ओपन-सोर्स, हम रिफैक्टर कर सकते हैं।, यह एक हालांकि लंबी और शामिल है, का एक बहुत कुछ है -
- Building a Linq Provider
- Walkthrough: Creating an IQueryable LINQ Provider
- Linq: Building an IQueryable provider series - in 17 parts! <:
LINQ प्रदाता संदर्भ की तलाश में दूसरों के लिए, यहाँ उन सहायक लिंक मैंने पाया हैं असली गहराई से स्पष्टीकरण और "प्रथम-टाइमर" के लिए अच्छा है।
"ड्रॉप-इन" द्वारा, मेरा मतलब है एक लिंक प्रदाता जो डीए परत के कार्यान्वयन के साथ काफी कसकर नहीं है; Linq2SQL और Linq2Entities, हालांकि वे SQL बनाते हैं, उन्हें स्कीमा से उत्पन्न डेटा एक्सेस ऑब्जेक्ट्स की एक परत के शीर्ष पर रखने के लिए डिज़ाइन किया गया है। मुझे यकीन नहीं है कि मैं उन्हें आसानी से WDSL- जेनरेट की गई वस्तुओं को लक्षित करने के लिए सेट कर सकता हूं, हालांकि यदि मैं कर सकता हूं, तो मैं 80% कर चुका हूं। – KeithS