我正在使用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();
}
这将返回一个包含正确数量的项目的列表,但它们都是空的 请帮帮忙,我现在已经开了几天了
答案 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();
}