Я использую 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();
}
Это возвращает список с правильным количеством объектов, но они все пусты, помогите, я - bloqued с этим в течение нескольких дней теперь
Ваш оператор select
возвращает анонимный тип: new {c.RegionCode, c.RegionName}
Это не может быть преобразовано в IRegion
- это будет в основном это утиная типизация, которую C # не поддерживает.
Ваш оператор linq должен возвращать тип, реализующий IRegion
- тогда ваш код должен работать.
Однако он не должен запускаться - Cast
должен вызывать исключение времени выполнения.
В основном:
// 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();
}
Может вам понадобится что-то вроде этого:
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();
}
Я удивлен, что он не просто полностью потерпел неудачу - вы пытаетесь преобразовать каждый результат в 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();
}