के साथ दक्षता में सुधार करना मैं पीओसीओ प्रथम दृष्टिकोण के साथ इकाई फ्रेमवर्क का उपयोग कर रहा हूं। SQL सर्वर से कनेक्ट करने के लिए डीआई कंटेनर और डीबीकॉन्टेक्स्ट क्लास का उपयोग करके स्टीव सैंडर्सन ने अपनी पुस्तक 'प्रो एएसपी.नेट एमवीसी 3 फ्रेमवर्क' में वर्णित पैटर्न का काफी पालन किया है।इकाई फ्रेमवर्क
SQL सर्वर में अंतर्निहित तालिकाओं में विभिन्न अनुप्रयोगों द्वारा उपयोग किए जाने वाले बहुत बड़े डेटासेट होते हैं। इस वजह से मैं संस्थाओं मैं अपने आवेदन में की जरूरत के लिए दृश्य बनाने के लिए पड़ा है:
class RemoteServerContext : DbContext
{
public DbSet<Customer> Customers { get; set; }
public DbSet<Order> Orders { get; set; }
public DbSet<Contact> Contacts { get; set; }
...
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Customer>().ToTable("vw_Customers");
modelBuilder.Entity<Order>().ToTable("vw_Orders");
...
}
}
और यह मेरा जरूरतों के अधिकांश के लिए ठीक से काम करने लगता है।
समस्या मेरे पास हैइन विचारों में से कुछ उन में डेटा का एक बड़ा सौदा है, ताकि जब मैं की तरह कुछ कहते हैं:
var customers = _repository.Customers().Where(c => c.Location == location).Where(...);
यह पूरे डेटा सेट वापस लाने जा करने के लिए है, जो कर सकते हैं प्रकट होता है LINQ क्वेरी से सेट करने से पहले कुछ समय लें जो मुझे चाहिए। यह बहुत अक्षम लगता है जब मानदंड केवल कुछ रिकॉर्ड पर लागू होता है और मुझे पूरा डेटा SQL सर्वर से वापस सेट किया जा रहा है।
मैं संग्रहित प्रक्रियाओं का उपयोग करके इस को हल करने के लिए कोशिश की है, इस तरह के रूप
public IEnumerable<Customer> CustomersThatMatchACriteria(string criteria1, string criteria2, ...) //or an object passed in!
{
return Database.SqlQuery<Customer>("Exec pp_GetCustomersForCriteria @crit1 = {0}, @crit2 = {1}...", criteria1, criteria2,...);
}
इस दौरान बहुत जल्दी है, समस्या यहाँ है कि यह एक DbSet वापस नहीं करता है और इसलिए मैं खो मेरी वस्तुओं के बीच कनेक्टिविटी, उदाहरण के लिए मैं किसी भी संबंधित ऑब्जेक्ट्स जैसे ऑर्डर या संपर्कों का संदर्भ नहीं दे सकता, भले ही मैं अपनी आईडी शामिल करता हूं क्योंकि रिटर्न टाइप उनमें से एक डीबीसेट के बजाय 'ग्राहक' का संग्रह है।
क्या किसी के पास क्वेरीिंग करने के लिए SQL सर्वर प्राप्त करने का बेहतर तरीका है ताकि मैं अप्रयुक्त डेटा के भार को पास नहीं कर रहा हूं?
+1। अधिक 'एक्स्टेंसिबल दृष्टिकोण' के लिए आप एक फ़ंक्शन लिख सकते हैं जो एक अनुमान लगाता है, और या तो '_repository.Customers() देता है। (कहां (predicate)' या (यदि यह अब IQueryable नहीं है) 'context.CreateQuery के साथ एक अलग फ़ंक्शन लिखें ("ग्राहक")। कहां (predicate) ', अंत में' .TLList() 'कॉल करने की संभावना के साथ। यह एक अच्छी, अनुकूलित अभिव्यक्ति का निर्माण करना चाहिए। –
हाय। IQueryable के दायरे में रहने के लिए आप अपने सुझाव के साथ स्पॉट पर थे। मैं एक आईनेमरेबल का उपयोग कर रहा था जो सर्वर को क्वेरी पास नहीं करता है लेकिन सभी रिकॉर्ड्स प्राप्त करता है और फिर उन्हें फ़िल्टर करता है। यहां आलेख देखें: http://www.fascinatedwithsoftware.com/blog/post/2011/06/27/INumerable-IQueryable-and-the-Entity-Framework-40.aspx मैंने SQL प्रोफाइलर के साथ जांच की है और वह सही है, IQueryable पैरामीटर को एक क्वेरी के रूप में पास करता है – GrahamJRoy