2011-10-20 8 views
7

मैं एक दूरस्थ डेटा स्रोत तक पहुंच रहा हूं और पाया कि एक समूह में शामिल होने के कारण IQueryable क्वेरी को IENumerable में परिवर्तित किया जा सकता है,समूह में शामिल होने के कारण IQueryable IENumerable में बदलना है, क्यों?

प्रश्न: क्या यह प्रदर्शन को प्रभावित करेगा? मैं संभव के रूप में डेटाबेस के लिए क्वेरी के रूप में ज्यादा बेचने के लिए, और निष्पादित नहीं स्मृति में कुछ भी चाहते हैं ...

var allusers = repo.All<User>().Where(x => x.IsActive); 
var _eprofile = repo.All<Profile>() 
    .Where(x => x.IsProfileActive) 
    .Join(allusers, x => x.UserID, y => y.UserID, (x, y) => new 
    { 
     eProfile = x, 
     profile = y 
    }) 
    .GroupJoin(_abilities, x => x.eProfile.ID, y => y.ID, (x, y) => new QuoteDTO 
    { 
     UserID = x.profile.Login, 
     Email = x.profile.Email, 
     Tel = x.profile.Tel, 
     Mobile = x.eProfile.Mobile, 
     CompanyID = x.profile.CompanyID, 
     Ability = y.Select(c => new AbilityDTO 
    { 
     Name= c.Name 
    }) 

    }); 

लाइन: .GroupJoin (_abilities, एक्स => x.eProfile.ID , वाई => y.ID, (एक्स, वाई) => नई QuoteDTO

  1. _abilities एक IQueryable है, मैं एक उपयोगकर्ता की क्षमता, वस्तुओं
  2. दूसरे भाग (एक्स का एक संग्रह मिल , वाई) - यहां y को एक IENumerable में बदल दिया जाता है ...

var cLists = List<int>(); // इस संग्रह ग्राहक कोड से पॉप्युलेट होता है कहते हैं कि यह // तर्क खातिर 1,3,55 शामिल की सुविधा देता है ...

var _abilities= repo.All<UserAbility>() 
     .Where(x => x.Status == Status.Active.ToString()) 
     .Where(x => cLists.Contains(x.CompetencyID)); 

नोट: कारण मैं उपयोग वर ताकि मैं मेरी पसंद की एक वस्तु में से पहले डीटीओ वस्तुओं डाला गया बदलना, मैं गुमनाम प्रकार का एक बहुत उपयोग कर रहा था सकता है ...

+0

कौन सा बिट "एक आईनेमरेबल में परिवर्तित हो रहा है"? और _ability क्या है? –

+0

यह एक उप प्रश्न है, मैंने उपरोक्त कोड को अद्यतन किया है ... – Haroon

+0

'_abilitiesable'' iQueryable' है? आपके सभी चर के डेटाटाइप क्या हैं? कृपया 'var' का उपयोग न करें, हम परिवर्तनीय प्रकारों के साथ-साथ कंपाइलर का अनुमान नहीं लगा सकते हैं। – Greg

उत्तर

1

IQueryable की परिभाषा:

public interface IQueryable<T> : IEnumerable<T>, IQueryable, IEnumerable 

... और ObjectQuery:

ObjectQuery<T> : ObjectQuery, IOrderedQueryable<T>, IQueryable<T>, IEnumerable<T>, IOrderedQueryable, IQueryable, IEnumerable, IListSource 

अधिकांश (? सब) LINQ भाव IEnumerable के रूप में एक वस्तु डाली लौट आते हैं। लेकिन ऑब्जेक्ट का प्रकार उस प्रकार के बनी हुई है जिस प्रकार से शुरू हुआ था।

नहीं, डेटाबेस को तब तक नहीं मारा जाता है जब LINQ-to-Entities क्वेरी को IENumerable के रूप में डाला जाता है, इसलिए प्रदर्शन से समझौता नहीं किया जाता है। यदि आप चाहें तो IQueryable या ObjectQuery के लिए अपस्टास्ट कर सकते हैं।

संपादित करें: स्पष्टीकरण के लिए, ऑब्जेक्टक्वियर, IQueryable, या IEnumerable के उदाहरण पर ToArray() को कॉल करना डेटाबेस को हिट करता है और परिणाम सेट पुनर्प्राप्त करता है।

संपादित करें: किसी क्वेरी के भीतर एक नई वस्तु बनाना (यानी नया उद्धरण डीटीओ) डेटाबेस को हिट करेगा, क्योंकि SQL ऑब्जेक्ट में नई ऑब्जेक्ट को स्टोर करने का कोई तरीका नहीं है। क्षमा करें, मुझे पहले थोड़ा याद आया।

+0

ऐसा प्रतीत होता है जैसे मेरा कोड वास्तव में इसके उप प्रश्नों के लिए डीबी को हिट करता है, यह मेरी वास्तविक समस्या है, मैंने सोचा था कि उपरोक्त प्रश्न पूछने से मुझे यह भी हल करने में मदद मिलेगी – Haroon

+0

आप ' री राइट। मैंने अपना जवाब संपादित किया। किसी क्वेरी के भीतर "नई" ऑब्जेक्ट बनाना डेटाबेस को हिट करेगा और परिणाम सेट वापस करेगा। – ken

+0

तो मुझे प्रत्येक क्वेरी के लिए एक अनाम वस्तु बनाना चाहिए, इस तरह मैं डेटाबेस को हिट नहीं करूंगा? – Haroon

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