簡體   English   中英

IEnumerable <>到IList <>

[英]IEnumerable<> to IList<>

我正在使用Linq查詢我的數據庫並返回一個通用的IList。

無論我嘗試什么,我都無法將IQueryable轉換為IList。

這是我的代碼。

我不能寫比這簡單,我不明白為什么它不起作用。

public  IList<IRegion> GetRegionList(string countryCode)
{
    var query = from c in Database.RegionDataSource
                where (c.CountryCode == countryCode)
                orderby c.Name
               select new {c.RegionCode, c.RegionName}; 

     return query.Cast<IRegion>().ToList(); 
}

這會返回一個包含正確數量的項目的列表,但它們都是空的請幫忙,我現在已經開了幾天了

您的select語句返回一個匿名類型: new {c.RegionCode, c.RegionName}

這不能轉換為IRegion - 這基本上是Duck-typing,C#不支持。

你的linq語句應該返回一個實現IRegion的類型 - 然后你的代碼應該工作。

但是它不應該運行 - Cast<IRegion>應該拋出運行時異常。

基本上:

// this isn't anonymous, and should cast
public class MyRegion : IRegion {
    public string RegionCode {get;set;}
    public string RegionName {get;set;}
}

public  IList<IRegion> GetRegionList(string countryCode)
{
    var query = from c in Database.RegionDataSource
                where (c.CountryCode == countryCode)
                orderby c.Name
               select new MyRegion {RegionCode = c.RegionCode, RegionName = c.RegionName}; 

     return query.Cast<IRegion>().ToList(); 
}

更新

如果底層Linq類型實現IRegion這可以簡單得多:

public  IList<IRegion> GetRegionList(string countryCode)
{
    var query = 
        from region in Database.RegionDataSource
        where region.CountryCode == countryCode
        orderby region.Name
        select region; 

     return query.ToList(); 
}

我很驚訝它不僅僅是完全失敗 - 你試圖將每個結果轉換為IRegion ,但是你正在生成匿名類型的實例,這肯定不會實現IRegion

一個實現IRegion的具體類型嗎?

IRegion的演員不會奏效。 您正在選擇一個不會實現IRegion的匿名類型。 有沒有辦法可以創建一個實現IRegion的實例?

也許你需要這樣的東西:

public  IList<IRegion> GetRegionList(string countryCode)
{
    var query = from c in Database.RegionDataSource
                where (c.CountryCode == countryCode)
                orderby c.Name
                select new Region() 
                    {
                        RegionCode = c.RegionCode, 
                        RegionName = c.RegionName
                    }; 

     return query.ToList(); 
}

也許你需要這樣的東西:

public  IList<IRegion> GetRegionList(string countryCode) 
{ 
    var query = from c in Database.RegionDataSource 
                where (c.CountryCode == countryCode) 
                orderby c.Name 
                select new Region()  
                    { 
                        RegionCode = c.RegionCode,  
                        RegionName = c.RegionName 
                    };  

     return query.ToList();  
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM