5

हम काफी बड़ी प्रणाली में ईएफ 4 का उपयोग कर रहे हैं और कभी-कभी ईएफ 4 एसक्यूएल में कुछ अभिव्यक्तियों को परिवर्तित करने में असमर्थ होने के कारण समस्याओं में भाग लेते हैं। वर्तमान में, हमें या तो कुछ फैंसी फुटवर्क (डीबी/कोड) करने की आवश्यकता है या केवल प्रदर्शन हिट स्वीकार करें और क्वेरी को मेमोरी में निष्पादित करने दें।विस्तारित ईएफ 4 एसक्यूएल जनरेशन

यह कहने की जरूरत नहीं है कि इनमें से कोई भी आदर्श नहीं है और कभी-कभी हैक जिन्हें हमने कभी-कभी उपयोगिता/रखरखाव को कम करने के लिए उपयोग किया है।

हम आदर्श रूप से क्या पसंद करेंगे EF4 SQL प्रदाता की SQL पीढ़ी क्षमताओं का विस्तार करने का एक तरीका है। जाहिर है, कुछ चीजें हैं जैसे नेट विधि कॉल जो हमेशा क्लाइंट-साइड होना चाहिए लेकिन तारीख की तुलना जैसे कुछ कार्यक्षमता (उदाहरण के लिए [लिंक में 0 सप्ताह से Entities) समूह सक्षम होना चाहिए।

मैंने गुगल किया है लेकिन शायद मैं गलत शब्दावली का उपयोग कर रहा हूं क्योंकि मुझे जो भी मिलता है वह ईएफ 4 एसक्यूएल जेनरेशन की नई विशेषताओं के बारे में जानकारी है।

ऐसे लचीला और एक्स्टेंसिबल ढांचे के लिए, यदि यह संभव नहीं है तो मुझे आश्चर्य होगा। मेरे सिर में, मैं [एसक्यूएल 2008] प्रदाता से उत्तराधिकारी की कल्पना कर रहा हूं और एसक्यूएल में कनवर्ट करने के लिए दिए गए अभिव्यक्ति वृक्ष में अतिरिक्त अभिव्यक्तियों/समान को संभालने के लिए इसे विस्तारित कर रहा हूं।

किसी भी मदद/पॉइंटर्स की सराहना की।

हम वीएस -2010 अल्टीमेट, नेट 4 (गैर-क्लाइंट प्रोफाइल) और ईएफ 4 का उपयोग कर रहे हैं। ऐप एएसपी.Net में है और यदि यह एक फर्क पड़ता है तो 64-बिट वातावरण में चल रहा है।

अद्यतन: स्पष्टीकरण के लिए कुछ अनुरोधों के जवाब में;

हम कोड-प्रथम दृष्टिकोण का उपयोग कर रहे हैं और एक कंसोल ऐप है जो डेटाबेस बनाता है और कुछ संदर्भ तालिकाओं को पॉप्युलेट करता है।

मैं संग्रहीत प्रोसेस से दूर रहना पसंद करूंगा जब तक कि वे भी इसी तरह से उत्पन्न नहीं हो सकते - वर्तमान में, डेटाबेस के नए संस्करण आवश्यकतानुसार उत्पन्न होते हैं और एक अलग प्रक्रिया डेटा माइग्रेट/सिंक करती है। सब कुछ हम वर्तमान में डेटाबेस उपयोग इकाइयों के संबंध में करते हैं। मैं मानता हूं कि मैं एक अच्छा कारण नहीं दे सकता लेकिन संग्रहीत प्रोसेस उत्पन्न करने के लिए एसक्यूएल स्क्रिप्ट चला रहा हूं इस परिदृश्य में गलत लगता है - लेकिन अगर मुझे गलत लगता है तो कृपया मुझे सही करें।

किसी विशिष्ट परिदृश्य के संबंध में, मुझे डर है कि मैं लंबे समय से लाल टेप अभ्यास के बिना हमारे कोड से एक नहीं दे सकता - link mentioned above हम जिस चीज की कोशिश कर रहे हैं उसका एक अच्छा उदाहरण है पूरा। इस उदाहरण में, एक तंत्र को लागू करने की तारीख अंकगणित अनुमति देने के लिए:

DateTime firstDay = GetFirstDayOfFirstWeekOfYear(); 
var userTimes = from t in context.TrackedTimes 
       group t by new {t.User.UserName, WeekNumber = (t.TargetDate - firstDay).Days/7} into ut 
       select new 
       { 
        UserName = ut.Key.UserName, 
        WeekNumber = ut.Key.WeekNumber, 
        Minutes = ut.Sum(t => t.Minutes) 
       }; 

मैं एक तरीका है कि इस अकेले नहीं बल्कि एसक्यूएल का उपयोग कर कैसे LINQ-टू-संस्थाओं (सर्वर साइड) का उपयोग कर यह करने के लिए पूरा किया जा सकता देख सकते हैं।

+0

इस तरह के एक संक्षिप्त प्रश्न का उत्तर देना मुश्किल है। क्या, ठीक है, क्या आप समर्थन करने की कोशिश कर रहे हैं। इस सामान को करने के लिए * कई * तरीके हैं (एडमफंक्शन, स्टोर क्वेरीज, शाब्दिक एसक्यूएल निष्पादित करना आदि ...)। –

+0

सच - मैंने एक उदाहरण शामिल करने के लिए प्रश्न का विस्तार किया है। मुझे उम्मीद है कि यह स्पष्ट है? – Basic

उत्तर

9

मैं पहली बार देख सिफारिश करेंगे EntityFunctions (सामान्य) में या SqlFunctions (SQL सर्वर केवल) है, जो प्रदान: यहाँ एक अच्छा उदाहरण "जहाँ में" प्रकार के प्रश्नों शामिल() फ़ंक्शन निष्पादित करने के लिए simulates कि है सामान्य LINQ से Entities क्वेरी में बहुत से अंतर्निहित डेटाबेस कार्यक्षमता। यदि यह पर्याप्त नहीं है, तो आप अंतर्निहित डेटाबेस फ़ंक्शन या उपयोगकर्ता द्वारा परिभाषित संग्रहीत प्रक्रिया को मैप करने के लिए EdmFunctionAttribute का उपयोग कर सकते हैं। एक तीसरा विकल्प यह एक इकाई एसक्यूएल क्वेरी के रूप में काम करने का प्रयास करने के लिए है।

आपके द्वारा सुझाए गए अंतिम समाधान - एक ईएफ प्रदाता लिखना - काफी हेवीवेट है। एक ईएफ प्रदाता लिखना संभव हो सकता है जो मौजूदा SQL प्रदाता को लपेटता है, लेकिन आपको कम से कम अभिव्यक्ति पेड़ को एंटीटी एसक्यूएल में बदलना होगा। बहुत आसान ईएफ प्रदाता रैपर MSDN Code पर जारी किए गए हैं। हालांकि, मैं इसे अंतिम उपाय के रूप में मानता हूं।

+0

बहुत उपयोगी लिंक के लिए धन्यवाद। मुझे थोड़ा पढ़ने की आवश्यकता होगी और आपको वापस मिल जाएगा – Basic

+0

शानदार, धन्यवाद - हमारे पास वहां से कुछ विकल्प हैं जो हम शायद मिश्रण और मिलान करेंगे – Basic

1

आपके .NET- आधारित LINQ क्वेरीज़ से SQL तक रूपांतरण LINQ से संस्था प्रदाता द्वारा प्रबंधित किया जाता है। मुझे विश्वास नहीं है कि कोर अनुवाद/संकलन प्रक्रिया, जो बेहद जटिल है, विस्तार योग्य है। आपको स्क्रैच से अपना खुद का प्रदाता लिखना होगा।

मुझे अभी तक किसी भी क्वेरी में आने के लिए नहीं मिला है जिसे SQL में दर्शाया जा सकता है जिसे LINQ में व्यक्त नहीं किया जा सकता है। यदि आपके पास कोई क्वेरी है जो LINQ क्वेरी के रूप में लिखना मुश्किल है, तो क्या आपने इसके बजाय संग्रहित प्रक्रियाओं का उपयोग करने पर विचार किया है? यह मदद करेगा यदि आप उन प्रश्नों के कुछ उदाहरण प्रदान कर सकते हैं जो परिवर्तित नहीं होंगे।

अद्यतन:

एक अन्य विकल्प उन्नत विस्तार तरीकों कि कस्टम निर्मित भाव का उपयोग आपकी क्वेरी के रूप में तैयार करना है।

'Contains()' workaround using Linq to Entities?

+0

उत्तर के लिए धन्यवाद। कंटेनस() के लिए लिंक बहुत दिलचस्प है लेकिन हम जो भी खोज रहे हैं वह काफी नहीं है। हमें पहले से ही विस्तार विधियां मिल चुकी हैं जो अभिव्यक्तियों के लिए और/या विधियों को जोड़ती हैं। एक्सप्रेशन (फनक (टी, बूलियन) का ताकि अभिव्यक्ति के पेड़ उपयुक्त के रूप में विलय हो जाएं - जो विभिन्न स्तरों से कई प्रश्नों को संयोजित करने के लिए बहुत आसान है ऐप (उदाहरण के लिए सुरक्षा प्रतिबंध जोड़ने के लिए)। लेकिन जैसा कि मैं LINQ का उपयोग कर क्वेरी को संशोधित करने का तरीका नहीं देख सकता (उदाहरण के लिए डेट घटाव/दिन # विभाजन), मुझे नहीं लगता कि मैं इस तकनीक को कैसे लागू कर सकता हूं? – Basic

+0

आपके उत्तर के पहले भाग के जवाब में, ऐसा लगता है कि मैं क्या करने की कोशिश कर रहा हूं। मुझे संदेह करना शुरू हो गया था कि यह एक्स्टेंसिबल नहीं था क्योंकि मुझे कहीं और जानकारी नहीं मिली है। मैं निश्चित रूप से नहीं लिख सका मेरा खुद का प्रदाता खरोंच से है, इसलिए यह एक मृत अंत विचार हो सकता है। – Basic

+0

सीएएसटी (दिनांक समय के रूप में डेटटाइम ऑफसेट) <<<<<< लिंक-टू-एंटिटीज में ऐसा करने में शुभकामनाएं। ऐसा नहीं किया जा सकता है। कुछ इतना अविश्वसनीय रूप से सरल हो रहा है डेटटाइम ऑफसेट का डेटटाइम हिस्सा linq-to-entities में असंभव है, इसलिए आप कर सकते हैं स्थानीय दिनांक और समय से डेटटाइम ऑफसेट कॉलम को फ़िल्टर न करें, जो इसके पूरे उद्देश्य को हरा देता है। – Triynko

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