2009-03-30 17 views
6

मुझे गतिशीलता के लिए सहायता चाहिए जहां संबंध संबंधपरक तालिकाओं (एक से कई) पर LinqToSql में।लिंक से एसक्यूएल की गतिशीलता की आवश्यकता है जहां संबंधपरक तालिकाओं पर क्लॉज सहायता करें?

उपयोगकर्ता पृष्ठ से उपयोगकर्ता की स्थिति चुनें। (4 इनपुट है जो उपयोगकर्ता क्लॉज का चयन करते हैं)

उदाहरण के लिए ग्राहक तालिका और ऑर्डरडेट और शिपसीटी से ऑर्डर टेबल से कंपनी नाम और कंपनी टाइटल।

लेकिन उपयोगकर्ता से पेज इंटरफेस और गतिशील क्वेरी codebehind में उत्पन्न हो जाएगा उनमें से एक अयस्क कई का चयन करें और LinqToSql से चुन सकते हैं।

आप अन्य वेब पृष्ठों से समान प्रकार का उदाहरण दे सकते हैं।

alt text http://www.yazgelistir.com/Makaleler/Resimler/1000001875_Linq-Class-Server.jpg

उत्तर

5

dynamic linq library पर ScottGu के ब्लॉग की जाँच करें। मुझे लगता है कि यह मदद करेगा।

 var query = 
    db.Customers. 
    Where("City = @0 and Orders.Count >= @1", "London", 10). 
    OrderBy("CompanyName"). 
    Select("new(CompanyName as Name, Phone)"); 

क्वेरी ऊपर C# samples for Visual Studio से आया था:

यहाँ एक प्रश्न है कि दोनों ग्राहकों और आदेश तालिका हिट का एक उदाहरण है। डाउनलोड करें और \ LinqSamples \ DynamicQuery फ़ोल्डर में देखें और आपको और उदाहरण मिलेंगे।

+0

मैंने इस पृष्ठ पर भी दौरा किया। उदाहरण में, वे एक टेबल से चयन करते हैं और गतिशील बनाते हैं जहां इस पर खंड होता है। –

2

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

from cust in dc.Customer 
join ord in dc.Order on cust.CustomerID equals ord.CustomerID 
where (companyName == null || cust.CompanyName == companyName) 
    and (companyTitle == null || cust.CompanyTitle == companyTitle) 
    and (orderDate == null || ord.OrderDate == orderDate) 
    and (shipCity == null || ord.ShipCity == shipCity) 
select new {cust, ord} 
+1

1 स्थिर एसक्यूएल अच्छा नहीं होगा। एक प्रश्न के लिए केवल एक क्वेरी योजना बनाई जाएगी। उदाहरण के लिए, यदि आप पी 1 प्रदान करते हैं, लेकिन अच्छी तरह से काम नहीं करते हैं, तो यदि आप पी 2 या पी 1 और पी 3 के संयोजन प्रदान करते हैं, तो अच्छी तरह से काम कर सकते हैं। मेरे पास एक क्वेरी थी जो एकाधिक तालिकाओं (5+) में शामिल होती है और वैकल्पिक पैरामीटर विभिन्न तालिकाओं से संबंधित होते हैं। एक प्रश्न योजना SQL 2005 –

+1

@MichaelFreidgeim पर काम नहीं करती है उपर्युक्त उदाहरण * नहीं * परिणामस्वरूप एक स्थिर SQL क्वेरी होगी।एल 2 एस उन हिस्सों का मूल्यांकन करता है जिन्हें क्लाइंट साइड का मूल्यांकन किया जा सकता है और एक SQL क्वेरी उत्पन्न करता है जिसमें केवल उन हिस्सों को शामिल किया जाता है जिन्हें डेटाबेस द्वारा मूल्यांकन करने की आवश्यकता होती है। यदि उदा। companyName पैरामीटर शून्य है, कंपनी का नाम हिस्सा इसे एसक्यूएल में कभी नहीं बनायेगा जहां खंड। यह लिंक-टू-एसक्यूएल में खूबसूरत चीजों में से एक है। – KristoferA

12

आप कुछ इस तरह के लिए देख रहे मूल्यांकन मानकों का निर्धारण करने के है, जहां आप "आधार" क्वेरी को परिभाषित है, और फिर यदि जहां खंड उचित है एक: यहाँ इस बात का एक उदाहरण है?

var result = (from x in context.X 
       select x); 

if(some condition) 
{ 
    result = result.AsQueryable().Where(x => x.companyName == name); 
} 
if(some other condition) 
{ 
    result = result.AsQueryable().Where(x => x.companyTitle == title); 
} 

//return result.ToList(); 
//return result.FirstOrDefault(); 
//return result.Count(); //etc 

मैंने आपकी टिप्पणियों में से एक में देखा है कि आपने बताया है कि आपकी तालिकाएं विदेशी कुंजी से जुड़ती नहीं हैं? मुझे यकीन नहीं है कि आप किसी तरह के संदर्भित अखंडता या रिश्ते के बिना एक से कई रिश्तों को कैसे प्राप्त करते हैं?

+0

मैं एक LINQ नौसिखिया हूं, लेकिन क्या वह डीबी से डेटा के * सभी * को पुनर्प्राप्त नहीं करेगा और फिर इसे प्रगतिशील रूप से फ़िल्टर करेगा? मुझे लगता है कि डेटा की भारी मात्रा में डीबी को फ़िल्टरिंग करने और केवल इच्छित डेटा लौटने के लिए यह अधिक कुशल होगा। – redcalx

+0

नहीं, यह केवल तभी चयन करता है जब आप टॉलिस्ट(), गणना() इत्यादि जैसे कुछ करते हैं – RobS

+0

स्पष्टीकरण के लिए - डेटाबेस सभी डेटा वापस कर देगा, और डीबी क्लाइंट पंक्तियों के माध्यम से फ़िल्टर करेगा। यह डीबीई के WHERE खंड में गुजरने और फ़िल्टर किए गए डेटा को डीबी क्लाइंट में वापस करने से अलग है। उपर्युक्त कोड पूर्व में करेगा, इस प्रकार संभवतः डीबी से डीबी क्लाइंट को * बहुत अधिक डेटा भेजना चाहिए जो कि कड़ाई से जरूरी है। – redcalx

0

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

अगर मैं गलत हूं तो कृपया मुझे सही करें - लेकिन मैंने यही देखा है।

+0

क्या आप कोई उदाहरण पोस्ट कर सकते हैं? मेरे अनुभव में (एसक्यूएल प्रोफाइलर के साथ साबित) क्वेरी तब तक निष्पादित नहीं की जाती जब तक कि आप किसी प्रकार के ऑपरेशन को पूर्ववत नहीं करते हैं, जैसे ToList(), count() इत्यादि। – RobS

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