2009-08-10 19 views
6

मैं सिर्फ इस क्वेरी कक्षा को साझा करना चाहता था और इस पर अपने विचार प्राप्त करना चाहता था। क्वेरी क्लास एक डीबीकनेक्शन के खिलाफ क्वेरी निष्पादित करने में मदद करता है। मैंने कार्यान्वयन को शामिल नहीं किया है, यह पोस्ट करने के लिए थोड़ा सा है। यहाँ एक उदाहरण कॉल है, तो आप अनुमान लगा सकेंगे कि:मेरी क्वेरी कक्षा। आपकी राय?

OrdersDataTable table = 
    new Query(connection) 
    .Table("Orders") 
    .Fields("OrderID,CustomerID,Description,Amount") 
    .GreaterThan("OrderID", 1000) 
    .OrderBy("OrderID") 
    .Execute<OrdersDataTable>(); 

कारण यहाँ मैं कक्षा की तरह है:

  • ADO.NET कमान कोड लिखने की जरूरत नहीं है। इस वर्ग को कॉल करने से ADO.NET समतुल्य की तुलना में कम लाइनें होती हैं।
  • प्रत्येक सदस्य फ़ंक्शन देता है, इसलिए कई कॉलों को एक साथ जोड़ा जा सकता है। मुझे यकीन नहीं है कि इस पैटर्न के लिए कोई नाम है या नहीं। क्या आप जानते है?
  • MySQL, OleDb और SqlServer बोलियां हैंडल करता है।
  • एडीओ.NET समकक्ष की तुलना में मेरे लिए अधिक पठनीय लगता है।
  • कॉल का आदेश अप्रासंगिक है। सभी पैरामीटर आंतरिक संग्रह में buffered हैं और निष्पादन कहा जाता है जब पढ़ा जाता है।
  • मेरे परिदृश्य में मुझे कई डेटाबेस उत्पादों के साथ संवाद करने की आवश्यकता है, इसलिए मैं एक बार सामान्य रूप से क्वेरी लिखना चाहता हूं और केवल दिए गए कनेक्शन में पास होना चाहता हूं। संग्रहीत प्रोसेस जैसे डीबी-विशिष्ट विशेषताओं का लाभ उठाने में बहुत परेशानी होगी।

मेरे पास एक डीएएल है जो आंतरिक रूप से इस कक्षा का उपयोग करता है। यूआई कुछ क्वेरी पैराम पास करने और डेटाटेबल लौटाए जाने पर डीएएल में कॉल करेगा। कक्षा ने वास्तव में एलओएल डीएएल कार्यान्वयन को कम करने में मदद की है और साथ ही इसे और अधिक पठनीय बना दिया है।

OrdersDataTable orders = Orders.GetByOrderId(1) 

और impl:

public static OrdersDataTable GetByOrderId(int id) 
{ 
    return 
     new Query(connection) 
     .Table("Orders") 
     .Fields("OrderID,CustomerID,Description,Amount") 
     .Equals("OrderID", id) 
     .Execute<OrdersDataTable>(); 
} 

धन्यवाद

यहां नमूने दाल कॉल है!

संपादित करें: महान प्रतिक्रिया के लिए सभी को धन्यवाद। आप में से कई ने LinqToSql का सुझाव दिया। मैंने लिंक का चयन नहीं किया क्योंकि माइक्रोसॉफ्ट वर्तमान में केवल एसक्यूएल सर्वर का समर्थन करता है। मुझे जेट, माईएसक्ल और एसक्यूएल सर्वर टेबल से पूछताछ करने की ज़रूरत है।

किसी ने पूछा कि कैसे AND और OR क्लॉज का निर्माण किया जाता है। यहाँ प्रत्येक

//and example 
    public static OrdersDataTable GetByOrderIdAndCustomerId(int orderId, int customerId) 
    { 
     return 
      new Query(connection) 
      .Table("Orders") 
      .Fields("OrderID,CustomerID,Description,Amount") 
      .Equals("OrderID", orderId) 
      .Equals("CustomerID", customerId) 
      .Execute<OrdersDataTable>(); 
    } 

//or example 
    public static OrdersDataTable GetByOrderIdOrCustomerId(int orderId, int customerId) 
    { 
     return 
      new Query(connection) 
      .Table("Orders") 
      .Fields("OrderID,CustomerID,Description,Amount") 
      .OrBegin 
      .Equals("OrderID", orderId) 
      .Equals("CustomerID", customerId) 
      .OrEnd 
      .Execute<OrdersDataTable>(); 
    } 
+4

उत्सुकता से बाहर ... यदि आप सी # का उपयोग कर रहे हैं, तो LINQ के साथ क्या गलत है? –

+0

मुझे यह पसंद है! यह अच्छा होगा अगर आप मेरे जैसे हैं और 2.0 में फंस गए हैं। –

+0

मुझे यह पसंद है। आपको यह पता होना चाहिए कि, यदि आप धाराप्रवाह इंटरफ़ेस डॉटिंग शैली पसंद करते हैं, तो आप इसे लिंक के साथ भी कर सकते हैं। –

उत्तर

3

ऐसा लगता है कि आप एक बहुत अच्छी छोटी ORM लिखा है का एक उदाहरण भंडार (या बंद करने के लिए) पैटर्न के एक कार्यान्वयन के साथ (संबंधपरक नक्शाकार वस्तु)। आपने फ्लुएंट इंटरफेस नामक डिज़ाइन पैटर्न का भी लाभ उठाया जो आपको करने की इजाजत दे रहा है। टेबल। एक दूसरे से कैस्केडिंग।

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

संपादित करें: ही संभव क्षेत्र मैं सुधार के लिए देख सकते हैं और जब वस्तु तथ्य बदल हर कॉल के लिए एक नया क्वेरी है और शायद एक निर्भरता इंजेक्शन रूपरेखा है कि सही प्रदाता इंजेक्षन जाएगा उपयोग करने के लिए अपने कोड बदलने जा करने के लिए होगा कहा जाता है कि यह क्वेरी के लिए डेटाबेस लेनदेन शुरू करेगा।यदि आपका कोड पहले से ही क्वेरी क्लास में आंतरिक रूप से बहुत अधिक करता है जिसे "गरीब आदमी की निर्भरता इंजेक्शन" कहा जा सकता है या कम से कम यह बहुत ही समान है (आपके कार्यान्वयन के आधार पर) जो कि यह आपके लिए पहले से ही काम कर रहा है और आप वास्तव में बढ़ने का इरादा नहीं रखते हैं अपने प्रकार के डेटाबेस समर्थन के बाहर गरीब आदमी की डी ठीक होना चाहिए। मैं अब किसी भी उपयोग में नए कीवर्ड का प्रशंसक नहीं हूं क्योंकि यह आमतौर पर कोड युग्मन के उच्च स्तर का कारण बनता है कि एक डी ढांचा कम हो जाता है (या यह छिपाने वाली विधि के लिए खराब खराब डिज़ाइन निर्णय है)।

मार्क के उत्तर के जवाब में, मैं आम तौर पर कभी भी कोड पीढ़ी का प्रशंसक नहीं हूं, यह हमेशा विफलता का मुद्दा बनता प्रतीत होता है हालांकि उसके पास शामिल जादू तारों की मात्रा को कम करने के लिए बहुत अच्छा बिंदु है। मैं बजाय हालांकि इस संभाल करने लैम्ब्डा ऑपरेटर और एक्सप्रेशन का उपयोग करने का निर्णय लेंगे, तो आप प्राप्त कर सकते थे इस:

public static OrdersDataTable GetByOrderId(int id) 
{ 
    return 
     new Query(connection) 
     .Table(x => Inflector.Pluralize(x.GetType()) 
     .Fields(x=> { x.OrderID, x.CustomerID, x.Description, x.Amount }) 
     .Equals(x=>x.OrderID, id) 
     .Execute<OrdersDataTable>(); 
} 

यह आपको लाभ उठाने के लिए अनुमति देता है जादू स्ट्रिंग रिफैक्टरिंग सभी मुद्दों का निकाल देंगे माइक्रोसॉफ्ट के रिफैक्टरिंग उपकरण बहुत आसान में बनाया या Resharper (निश्चित रूप से resharper refactoring के दौरान जादू तार मिल सकता है)।

इन्फ्लेक्टर एक मुफ्त लाइब्रेरी है (याद नहीं है कि यह ओएसएस है या नहीं) जिसमें पाठ से निपटने के लिए कार्यक्षमता शामिल है, बहुवचन विधि एक शब्द लेगी और इसे ... बहुवचन अगर आप अनुमान लगा सकते हैं। जहां यह उपयोगी होता है, जब आपको स्टोरी पसंद होती है जहां आप गेट टाइप() + "एस" नहीं जा सकते हैं क्योंकि स्टोरी सही नहीं हैं और इन्फ्लिक्टर आपको "कहानियां" सही तरीके से वापस कर देगा।

+0

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

+0

मैं इन्फ्लिक्टर को देखूंगा। मुझे Lamdas के उपयोग पसंद है। धन्यवाद! – Steve

+0

यदि आपको पहले से ही यूआरएल नहीं मिला है: http://andrewpeters.net/inflectornet/ –

1

मैं आम तौर पर चीजों को करने के इन कार्यात्मक तरीकों से दूर रहता हूं और दूर रहता हूं। जब कभी उठते हैं तो मुद्दों को ट्रैक करने के लिए कभी-कभी भ्रमित हो सकता है।

मैं केवल LINQ का उपयोग करता हूं और एक ही कार्य को अधिक पठनीय कोड के साथ पूरा करता हूं।

0

हालांकि मैं मानता हूं कि लिंक को ऐसा करने के लिए डिज़ाइन किया गया है, यदि आपकी आवश्यकताओं के लिए यह काम करता है तो अपना खुद का आर्किटेक्चर बनाने का कोई कारण नहीं है।

मैं कुछ और आगे जाऊंगा और शाब्दिक पाठ की आवश्यकता को कम करने के लिए गणना किए गए अंकित प्रकार या अन्य ऑब्जेक्ट आधारित बनाने के लिए कोड जनरेशन का उपयोग करूंगा। (और टाइपो को कम करें)

+1

यदि आपके पास अपने आर्किटेक्चर को लागू करने के लिए समय और धन मिलता है तो कोई मौजूदा व्यक्ति वही काम करेगा, तो सुनिश्चित करें। लेकिन जिन परियोजनाओं पर मैंने काम किया है, यह मामला नहीं है। – mkchandler

+0

मैं आपसे सहमत हूं। मैं उच्च स्तर पर चीजों को आसान और तेज़ बनाने के लिए लिंक या अन्य तकनीक (मैं संग्रहीत प्रक्रियाओं और उत्पन्न ओआरएम/बिजनेस ऑब्जेक्ट्स का उपयोग करता हूं) को अपना समय व्यतीत करता हूं। यह संभावित रूप से समस्याओं को हल नहीं करता है या विकास को तेज नहीं करता है। –

0

यह एक मजेदार व्यायाम है और आपका कोड काफी पठनीय और संक्षिप्त प्रतीत होता है। एक उत्पादन माहौल में, मैं शायद पहिया को फिर से शुरू करने से दूर रहूंगा जब तक कि गंभीर आवश्यकता न हो। मेरा समय, और आपका, एप्लिकेशन में मूल्य बनाने में बेहतर खर्च करेगा, कस्टम ओआरएम में कार्यक्षमता नहीं जोड़ना, जिसे हम अन्य में, "परीक्षण", युद्ध-परीक्षण, पैकेज जैसे LINQ और NHibernate के लिए प्राप्त कर सकते हैं।

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