2010-10-22 63 views
5

我試圖制定一個LINQ查詢選擇列表的子表,其中符合WHERE條件,像這樣:LINQ鑄造可枚舉特定類型的列表

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.IEnumerable轉換爲System.Collections.Generic.List

於是,我就應用轉換運算符,但失敗了。我現在看到,我不想轉換元素的類型。我該如何解決這個問題?謝謝!

回答

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

謝謝!我只是想到了一些東西 - 執行。這些查詢在枚舉之前不會執行。我將這些構建到返回查詢的DataLayer中。假設我選擇你的第一個並擁有:public List GetBasesForFieldOfficeCD(string officeCD){List bases = this.GetAllBases(); List thebases =(來自aBase中的基礎,其中aBase.OfficeCD == officeCD選擇aBase).ToList();返回基地; } - 我需要在返回之前枚舉/執行查詢嗎? – 2010-10-22 17:04:13

+0

'ToList()'會爲你做枚舉。最終的結果是:「普通」的數據結構,而不是查詢。基本上,列表不記得它是如何創建的。另一方面,你可能會更喜歡你的'GetBasesForFieldOfficeCD'方法,而不是返回一個延遲執行的查詢。在這種情況下,使返回類型'IEnumerable '並移除對'ToList()'的調用。 – Ani 2010-10-22 19:45:37

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

我不認爲他需要'選擇新的Entities.Base',因爲它會創建與舊對象具有相同內容的所有新對象。他很可能希望相同的對象來填充這兩個列表。 – Gabe 2010-10-22 16:53:10

+0

@加貝 - 可能。我同意Ani的回答(因此是信用),但是想要提出一個不同的選擇來考慮。 – 2010-10-22 16:57:43

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);