दिलचस्प पोस्ट
क्या जावा का उपयोग करते हुए विंडो की चाबियाँ अक्षम करना संभव है? मैं एंड्रॉइड एसडीके के जरिए रूट अनुमतियां कैसे प्राप्त करूं? अगर कोई फ़ंक्शन किसी वैध रिटर्न प्रकार के साथ कोई मान नहीं देता है, क्या कचरा को फेंकने के लिए क्या यह ठीक है? mysql त्रुटि 1364 फ़ील्ड में कोई डिफ़ॉल्ट मान नहीं है स्ट्रिंग से एक क्लास का एक उदाहरण बनाएं विंडोज 7 और विस्टा यूएसी – सी # में प्रोग्रामेंटल रूप से अनुरोध की ऊंचाई mysql_escape_string वी.एस. mysql_real_escape_string मैं एक घुमावदार मार्ग के साथ एक दृश्य या छवि के आंदोलन को कैसे सजीव कर सकता हूं? सारणी बनाने में त्रुटि: आपके क्रम के पास आपके एसक्यूएल सिंटैक्स में एक त्रुटि है (ऑर्डर (ऑर्डर_id INT UNSIGNED NOT NULL AUTO_INCREMENT, user_id) लाइन 1 आरबीआई में rbind का उपयोग करके एकाधिक .csv फ़ाइलों को एकल डेटाफ्रेम में लोड करने में समस्या MySQL ENUM प्रकार बनाम मेजबान मेमोरी लीक का निदान – # बाइट्स की स्वीकार्य स्मृति आकार समाप्त हो गया क्लिक करने योग्य लेबल के साथ एक HTML चेकबॉक्स कैसे बनाएं NSString को NSInteger में परिवर्तित करें? क्या है क्रेट (बंडल सहेजे गए इन्स्टेंसस्टेट)

IQueryable लौटने के लिए <T> या वापस नहीं IQueryable <T>

मेरे पास एक रिपॉजिटरी वर्ग है जो मेरे LINQ से एसक्यूएल डेटा संदर्भ को लपेटता है। रिपोझिटरी क्लास एक बिजनेस लाइन क्लास है जिसमें सभी डेटा स्तरीय तर्क (और कैशिंग और ऐसे) शामिल हैं।

यहां मेरा रेपो इंटरफ़ेस का मेरा v1 है

public interface ILocationRepository { IList<Location> FindAll(); IList<Location> FindForState(State state); IList<Location> FindForPostCode(string postCode); } 

लेकिन FindAll के लिए पेजिंग को संभालने के लिए, मैं बहस कर रहा हूं कि पेजिंग जैसे परिस्थितियों के लिए इंटरफ़ेस को सरल बनाने के लिए आईएलआईटी के बजाय IQueryable <ILocation> को बेनकाब करने के लिए या नहीं।

डेटा रिपो से आईक्यूबएबल को उजागर करने के पेशेवर और विपक्ष क्या हैं?

किसी भी प्रकार के मदद की बहुत सराहना की जाएगी।

वेब के समाधान से एकत्रित समाधान "IQueryable लौटने के लिए <T> या वापस नहीं IQueryable <T>"

गुण; composability:

  • कॉलर फ़िल्टर जोड़ सकते हैं
  • कॉलर पेजिंग जोड़ सकते हैं
  • कॉलर सॉर्टिंग जोड़ सकते हैं
  • आदि

विपक्ष; गैर testability:

  • आपकी रिपॉजिटरी अब इकाई परीक्षण योग्य नहीं है; आप एक पर भरोसा नहीं कर सकते: यह काम कर रहा है, बी: यह क्या करता है;
    • कॉलर एक गैर-ट्रांसलेट योग्य फ़ंक्शन जोड़ सकता है (यानी कोई TSQL मैपिंग; रनटाइम पर ब्रेक)
    • कॉलर एक फिल्टर / सॉर्ट जोड़ सकता है जो इसे कुत्ते की तरह प्रदर्शन करता है
  • चूंकि कॉल करने वालों को IQueryable<T> को कंपोज़ योग्य होने की उम्मीद है, यह गैर-कम्पोज़ योग्य कार्यान्वयनों को नियंत्रित करता है – या यह आपको अपने स्वयं के क्वेरी प्रदाता को उनके लिए लिखने के लिए मजबूर करता है
  • इसका मतलब है कि आप डीएएल को अनुकूलित नहीं कर सकते / प्रोफ़ाइल नहीं कर सकते

स्थिरता के लिए, मैंने अपने रिपॉजिटरी पर IQueryable<T> या Expression<...> को उजागर नहीं करने के लिए लिया है। इसका मतलब है मुझे पता है कि रिपॉज़िटरी कैसे व्यवहार करती है, और मेरी ऊपरी परत चिंता किए बिना मोजे का उपयोग कर सकते हैं "वास्तविक भंडार का समर्थन करता है यह?" (एकीकरण परीक्षणों को मजबूर)

मैं अभी भी रिपॉजिटरी के अंदर IQueryable<T> आदि का उपयोग करता हूं – लेकिन सीमा से अधिक नहीं मैंने यहां इस विषय पर कुछ और विचार पोस्ट किए हैं । यह रिपॉजिटरी इंटरफ़ेस पर पेजिंग मापदंडों को डालना आसान है। आप वैकल्पिक पृष्ठन पैरामीटर्स जोड़ने के लिए एक्सटेंशन विधियों (इंटरफ़ेस पर) का भी उपयोग कर सकते हैं, ताकि कंक्रीट कक्षाओं में केवल 1 तरीके लागू हो सकें, लेकिन कॉलर के लिए 2 या 3 ओवरलोड उपलब्ध हो सकते हैं।

जैसा कि पिछले उत्तर द्वारा उल्लिखित है, IQueryable को उजागर करने से कॉल करने वालों को IQueryable के साथ खेलना है, जो कि या यह खतरनाक हो सकता है

व्यापारिक तर्क की पहली जिम्मेदारी को अपने डेटाबेस की अखंडता बनाए रखना है।

आप आईएलआईएस को उजागर करना जारी रख सकते हैं और अपने मापदंडों को निम्नलिखित के रूप में बदल सकते हैं, यह हम कैसे कर रहे हैं …

 public interface ILocationRepository { IList<Location> FindAll(int start, int size); IList<Location> FindForState(State state, int start, int size); IList<Location> FindForPostCode(string postCode, int start, int size); } 

यदि आकार == -1 तो सभी वापस …

वैकल्पिक तरीका …

यदि आप अभी भी IQueryable वापस करना चाहते हैं, तो आप अपने कार्यों के अंदर IQueryable सूची को वापस कर सकते हैं .. उदाहरण के लिए …

 public class MyRepository { IQueryable<Location> FindAll() { List<Location> myLocations = ....; return myLocations.AsQueryable<Location>; // here Query can only be applied on this // subset, not directly to the database } } 

पहली विधि का स्मृति पर एक फायदा है, क्योंकि आप सभी के बजाय कम डेटा वापस करेंगे।

मैं IList बजाय IEnumerable का उपयोग करने की सलाह देता हूं, इसके साथ आपको अधिक लचीलेपन होगा।

इस तरह आप डीबी से प्राप्त कर सकते हैं केवल उस डेटा के उस हिस्से को, जो कि आप वास्तव में आपके रिपॉजिटरी में अतिरिक्त काम किए बिना उपयोग करेंगे।

नमूना:

 // Repository public interface IRepository { IEnumerable<Location> GetLocations(); } // Controller public ActionResult Locations(int? page) { return View(repository.GetLocations().AsPagination(page ?? 1, 10); } 

कौन सा सुपर स्वच्छ और सरल है