2008-09-15 10 views
8

इस परियोजना पर मैं जिस परियोजना पर काम कर रहा हूं, उसमें एक सी # कॉम ऑब्जेक्ट को दोबारा शामिल करना शामिल है जो कुछ एसक्यूएल 2005 डेटाबेस में डेटाबेस एक्सेस लेयर के रूप में कार्य करता है।सी #/.NET3.5 में गतिशील एसक्यूएल प्रश्नों का निर्माण करने का सबसे अच्छा तरीका?

मौजूदा कोड के लेखक ने मैन्युअल रूप से एक स्ट्रिंग का उपयोग करके सभी एसक्यूएल प्रश्नों का निर्माण किया है और काफी जटिल एसक्यूएल स्टेटमेंट (~ 10 जॉइन,> 10 उप चयन, ~ 15-25 जहां स्थितियां और ग्रुपबी का निर्माण करने के लिए कई कथन हैं))। आधार तालिका हमेशा एक ही होती है, लेकिन जुड़ने, परिस्थितियों और समूहों की संरचना मेरे वर्ग/विधि में पारित पैरामीटर के सेट पर निर्भर करती है।

इस तरह की एसक्यूएल क्वेरी का निर्माण करना काम करता है लेकिन यह स्पष्ट रूप से एक बहुत ही सुरुचिपूर्ण समाधान नहीं है (और पढ़ने के लिए भी मुश्किल/समझना और बनाए रखना मुश्किल है) ... मैं बस एक साधारण "क्वेरीबिल्डर" लिख सकता हूं लेकिन मैं यकीन है कि है कि मैं इस तरह की समस्या के साथ पहली बार एक नहीं कर रहा हूँ कर रहा हूँ, इसलिए मेरे सवालों का:

  • कैसे आप अपने डेटाबेस क्वेरी बनाने करते हैं?
  • क्या सी # गतिशील रूप से प्रश्नों का निर्माण करने का एक आसान तरीका प्रदान करता है?

उत्तर

9

मैं लॉग ऑन उपयोगकर्ता इनपुट पर फ़िल्टर प्रविष्टियों प्राप्त करने के लिए इसी तरह के कुछ करने के लिए सी # और Linq इस्तेमाल किया (Conditional Linq Queries देखें):

IQueryable<Log> matches = m_Locator.Logs; 

// Users filter 
if (usersFilter) 
    matches = matches.Where(l => l.UserName == comboBoxUsers.Text); 

// Severity filter 
if (severityFilter) 
    matches = matches.Where(l => l.Severity == comboBoxSeverity.Text); 

Logs = (from log in matches 
     orderby log.EventTime descending 
     select log).ToList(); 

संपादित करें: क्वेरी तब तक नहीं की जाती जब तक कि अंतिम विवरण में .सूची()।

+1

आईएफ स्टेटमेंट का एक गुच्छा एक गतिशील क्वेरी कैसे है? –

+0

IQueryable अंतिम पंक्ति में SQL में परिवर्तित हो जाता है, जहां क्वेरी वास्तव में चलती है; सभी जहां LINQ कथन एक एसक्यूएल कहां खंड बन जाते हैं। इस तरह से मैं अत्यधिक परिवर्तनीय एसक्यूएल भी करता हूं। ऐसा करने के लिए एक संग्रहित प्रो लिखने की कोशिश करने से यह बहुत साफ है। –

+0

@ किरालेसा: स्पष्टीकरण के लिए धन्यवाद। –

1

इस तरह से मैं यह करना होता है:

public IQueryable<ClientEntity> GetClients(Expression<Func<ClientModel, bool>> criteria) 
    { 
     return (
      from model in Context.Client.AsExpandable() 
      where criteria.Invoke(model) 
      select new Ibfx.AppServer.Imsdb.Entities.Client.ClientEntity() 
      { 
       Id = model.Id, 
       ClientNumber = model.ClientNumber, 
       NameFirst = model.NameFirst, 
       //more propertie here 

      } 
     ); 
    } 

अभिव्यक्ति पैरामीटर में पारित आप अलग अलग कहां खंड, शामिल होता है, आदि इस अभिव्यक्ति के साथ बनाएंगे गतिशील क्वेरी किया जाएगा रन 0 पर को शामिल किया जाएगा और आपको जो चाहिए वह आपको देगा।

यहाँ कैसे इसे कहते हैं का एक नमूना है:

public IQueryable<ClientEntity> GetClientsWithWebAccountId(int webAccountId) 
    { 
     var criteria = PredicateBuilder.True<ClientModel>(); 
     criteria = criteria.And(c => c.ClientWebAccount.WebAccountId.Equals(webAccountId)); 
     return GetClients(criteria); 
    } 
1

इसका यदि आप एक parameterised strored प्रक्रिया के रूप में लागू करने और डेटाबेस में यह अनुकूलन कर सकते हैं गतिशील रूप से LINQ के माध्यम से एसक्यूएल या कम से एक ORM पैदा करने पर विचार करने के बजाय लायक क्रम। अक्सर यह बेहतर प्रदर्शन करेगा। मैं इसे थोड़ा पुराना जानता हूं लेकिन कभी-कभी इसका सबसे प्रभावी दृष्टिकोण है।

+0

हां, हमने पहले से ही इसमें देखा है लेकिन यह वास्तव में काम नहीं करता है क्योंकि हमारे प्रश्न बहुत अधिक बदलते हैं ... – Ben

0

यदि एमएस एसक्यूएल सर्वर के अतिरिक्त सी # और .NET 3.5 का उपयोग करते हैं तो LINQ से SQL निश्चित रूप से जाने का तरीका है। यदि आप उस संयोजन के अलावा कुछ भी उपयोग कर रहे हैं, तो मैं एक ओआरएम मार्ग की सिफारिश करता हूं, जैसे कि nHibernate या Subsonic

+0

लिंक से एसक्यूएल यह तब है :) – Ben

2

जब तक निष्पादन समय वास्तव में महत्वपूर्ण नहीं होता है, तो मैं व्यापार तर्क को दोबारा करने पर विचार करता हूं कि (अक्सर) डाटाटायर तक और गजियन-लंबे संग्रहित प्रोसेस में अपना रास्ता ढूंढता है। रखरखाव, संपादन और परिशिष्टता के मामले में मैं हमेशा व्यवसाय करने वाले को कोड उठाने के लिए प्रयास करता हूं (सी # प्रोग्रामर के रूप में)।

किसी को एल्स 8000 लाइन एसक्यूएल स्क्रिप्ट को सॉर्ट करने का प्रयास करना मेरा पसंदीदा काम नहीं है।

:)

// डब्ल्यू

1

मैं Linq की संभावना का पता लगा, लेकिन मैं अभी तक किसी को कोशिश करते हैं और जटिलता के एक LINQ क्वेरी कि बेन

सुझाव दे रहा है देखने के लिए काफी जटिल एसक्यूएल कथन (~ 10 जुड़ता है,> 10 उप चयन, ~ 15-25 जहां स्थितियां और समूहबी)

क्या किसी के पास बड़ी ली के उदाहरण हैं एनक्यू प्रश्न, और उनकी प्रबंधनीयता पर कोई टिप्पणी?

+0

मैं शायद जटिलता को कम करने की कोशिश करने में कुछ समय बिताने जा रहा हूं ... – Ben

1

सिस्टम के साथ SQL से लिंक SQL.Linq.Dynamic कुछ अच्छी संभावनाएं लाता है। http://blog.huagati.com/res/index.php/2008/06/23/application-architecture-part-2-data-access-layer-dynamic-linq

... और यहाँ:

मैं नमूना कोड के टुकड़े की एक जोड़ी यहाँ पोस्ट किया है http://episteme.arstechnica.com/eve/forums/a/tpc/f/6330927813/m/717004553931?r=777003863931#777003863931

1

मैं इस देर में आ रहा हूँ और एक वोट दें के लिए कोई मौका नहीं है, लेकिन वहाँ एक महान समाधान जिसे मैंने नहीं देखा है: linq-to-object के साथ प्रक्रिया/फ़ंक्शन का संयोजन। या टू-एक्सएमएल या टूटेटेबल मुझे लगता है।

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

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

आप दोनों के फायदे का उपयोग कर सकते हैं:

  • सर्वर पर जितना संभव हो उतना कुल रिकॉर्ड को कम; पागल जुड़ें सर्वर पर देखभाल करने के लिए पाएं। इस सामान पर डेटाबेस अच्छा हैं।
  • लिंक (ऑब्जेक्ट आदि) शक्तिशाली नहीं है लेकिन जटिल मानदंडों को व्यक्त करने में बहुत अच्छा है; तो इसे विभिन्न संभावित भेदों के लिए उपयोग करें जो कोड में जटिलता जोड़ते हैं लेकिन डीबी हैंडलिंग में बेहतर नहीं होगा। कम, सामान्यीकृत परिणाम सेट पर ऑपरेटिंग, लिनक्स बिना प्रदर्शन प्रदर्शन के जटिलता व्यक्त कर सकता है।

डीबी में कौन सा मानदंड संभालना है और कौन सी linq के साथ तय करना है? अपने फैसले का प्रयोग करें। यदि आप जटिल डीबी प्रश्नों को कुशलतापूर्वक संभाल सकते हैं, तो आप इसे संभाल सकते हैं। पार्ट आर्ट, पार्ट साइंस।

+0

आप जो कह रहे हैं वह डीबी को ऐसा करने देता है जो यह अच्छा है? मुझे लगता है कि linq KristoferA किया जाता है बहुत प्रभावशाली है। दूसरी तरफ, मैं कुछ ट्रांजैक्ट एसक्यूएल के साथ डेटाबेस के प्रदर्शन को सुदृढ़ कर रहा हूं। नोट डेटाबेस के लिए अमूर्त परत कक्षाओं का एक सेट हो सकता है। लिनक दृष्टिकोण जेनेरिक प्रोग्रामिंग में से एक प्रतीत होता है, लेकिन हकीकत में आपको लिनक्स फ्रेमवर्क को इष्टतम तरीके से क्वेरी प्रबंधित करने की आवश्यकता होती है। तो तकनीकी रूप से प्रभावशाली होने पर, अगर कुछ और नहीं, तो यह थोड़ा अपारदर्शी लगता है, और मेरे प्रोड वातावरण ने इस सामान को संग्रहीत प्रोसेस में वैसे भी रखा है। –

+0

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

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