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

10-04 13:48