IEnumerable的<>到IList<>

时间:2010-04-28 09:00:20

标签: c# linq ienumerable

我正在使用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(); 
}

这将返回一个包含正确数量的项目的列表,但它们都是空的 请帮帮忙,我现在已经开了几天了

5 个答案:

答案 0 :(得分:16)

您的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(); 
}

答案 1 :(得分:5)

我很惊讶它不仅仅是完全失败 - 你试图将每个结果转换为IRegion,但是你正在生成匿名类型的实例,这肯定不会实现{{1} }。

实现IRegion的具体类型吗?

答案 2 :(得分:2)

IRegion的演员无效。您选择的匿名类型不会实现IRegion。有没有办法可以创建一个实现IRegion的实例?

答案 3 :(得分:1)

也许你需要这样的东西:

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

答案 4 :(得分:0)

也许你需要这样的东西:

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