2010-10-22 15 views
5

मैं एक LINQ क्वेरी तैयार करने के लिए एक सूची का एक sublist चयन करने के लिए जहां यह मिलता है कोशिश कर रहा हूँ एक जहां हालत इतनी तरह:LINQ विशिष्ट प्रकार की सूची को Enumerable कास्ट

List<Entities.Base> bases = this.GetAllBases(); 
List<Entities.Base> thebases = from aBase in bases 
           where aBase.OfficeCD == officeCD 
           select aBase; 

जहां बेस सिर्फ एक इकाई वर्ग है:

public string BaseCD { get; set; } 
     public string BaseName { get; set; } 
     public string OfficeCD { get; set; } 
     public DateTime EffectiveDate { get; set; } 
     public DateTime ExpirationDate { get; set; } 

मैं एक त्रुटि "implictly System.Collections.Generic.List

के प्रकार System.Collections.Generic.IEnumerable कनवर्ट नहीं कर सकता हो रही है तो मैं कास्ट ऑपरेटर लागू करने की कोशिश की लेकिन वह विफल रहता है। अब मैं देखता हूं कि मैं तत्व के प्रकार को बदलने की कोशिश नहीं कर रहा हूं। कैसे मैं इस मुद्दे को हल कर सकता हूँ? धन्यवाद!

उत्तर

10

यह वास्तव में एक समस्या नहीं है जिसे "कास्टिंग" द्वारा हल किया जा सकता है; आपके द्वारा प्राप्त की गई क्वेरी का परिणाम एक सूची नहीं है - यह एक स्थगित-निष्पादन अनुक्रम है जो मेलिंग पर पर मेल खाने वाले आइटम स्ट्रीम करेगा। अपने उद्देश्य को प्राप्त करने के लिए आपको इन परिणामों को वास्तव में List<T> में लोड करना होगा। उदाहरण के लिए, Enumerable.ToList विधि एक नई सूची तैयार करेगी, इसे क्वेरी के परिणामों के साथ पॉप्युलेट करें और फिर इसे वापस कर दें।

कुछ विकल्प:

var thebases = (from aBase in bases 
       where aBase.OfficeCD == officeCD 
       select aBase).ToList(); 

// fluent syntax 
var thebases = bases.Where(aBase => aBase.OfficeCD == officeCD) 
        .ToList(); 

// not a LINQ method - an instance method on List<T>. 
// Executes immediately - returns a List<T> rather than a lazy sequence 
var thebases = bases.FindAll(aBase => aBase.OfficeCD == officeCD); 

// "manual" ToList() 
var theBases = new List<Entities.Base>(); 
var matchingBases = from aBase in bases 
        where aBase.OfficeCD == officeCD 
        select aBase; 

foreach(var matchingBase in matchingBases) 
    theBases.Add(matchingBase); 
+0

धन्यवाद! मैंने बस कुछ सोचा - निष्पादित निष्पादन। ये प्रश्न तब तक निष्पादित नहीं होंगे जब तक कि उनका गणना नहीं किया जाता है। मैं इन्हें डेटालेयर में बना रहा हूं जो प्रश्नों को वापस कर देता है। मान लीजिए कि मैं अपना पहला चुनता हूं और हूं: सार्वजनिक सूची GetBasesForFieldOfficeCD (स्ट्रिंग ऑफिससीडी) {सूची bases = this.GetAllBases(); सूची thebases = (आधार पर एक बेस से जहां aBase.OfficeCD == officeCD एबेस का चयन करें) .सूची(); वापस लौटें; } -क्या मुझे वापस आने से पहले प्रश्नों को गणना/निष्पादित करने की आवश्यकता है? –

+0

'ToList()' आपके लिए गणना करेगा। अंतिम परिणाम: एक 'सामान्य' डेटा-संरचना, एक क्वेरी नहीं। असल में, एक सूची याद नहीं है कि यह कैसे बनाया गया था। दूसरी ओर, आप * पसंद * कर सकते हैं कि आपकी 'GetBasesForFieldOfficeCD' विधि बदले में एक स्थगित-निष्पादित क्वेरी लौटाती है। इस मामले में, वापसी प्रकार 'Inumerable ' बनाएं और 'toList() 'पर कॉल हटा दें। – Ani

2

विधि @Ani उल्लेख के अलावा, आप भी LINQ सीधे डेटा का चयन करने के लिए इस तरह उपयोग कर सकते हैं अपने वर्गों में:

List<Entities.Base> bases = this.GetAllBases(); 
List<Entities.Base> thebases = new List<Entities.Base>(
          from aBase in bases 
          where aBase.OfficeCD == officeCD 
          select new Entities.Base { 
           BaseCD = aBase.BaseCD, 
           BaseName = aBase.BaseName, 
           OfficeCD = aBase.OfficeCD, 
           EffectiveDate = aBase.EffectiveDate, 
           ExpirationDate = aBase.ExpirationDate 

         }; 
+0

मुझे नहीं लगता कि वह 'नई संस्थाओं का चयन करें' बेस 'चाहता है क्योंकि यह पुरानी वस्तुओं के समान सामग्रियों के साथ सभी नई वस्तुओं को बनाता है। वह संभवतः एक ही वस्तुएं दोनों सूचियों को पॉप्युलेट करना चाहता है। – Gabe

+0

@Gabe - संभवतः। मैं एनी के जवाब से सहमत हूं (इसलिए क्रेडिट), लेकिन विचार के लिए एक अलग विकल्प देना चाहता था। –

1

यहाँ एक प्रकार है Joel's answer पर जो उन्हें क्लोन करने की बजाय नई सूची के लिए मूल इकाइयों का पुन: उपयोग करता है:

List<Entities.Base> bases = this.GetAllBases(); 
List<Entities.Base> thebases = new List<Entities.Base>( 
          from aBase in bases 
          where aBase.OfficeCD == officeCD 
          select aBase); 
संबंधित मुद्दे