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();
}
Это возвращает список с нужным количеством элементов, но все они пусты
Пожалуйста, помогите, я просыпаюсь с этим на пару дней.
Ответы
Ответ 1
Ваш оператор select
возвращает анонимный тип: new {c.RegionCode, c.RegionName}
Это не может быть преобразовано в IRegion
- в основном это Duck-typing, который С# не поддерживает.
Ваш оператор 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();
}
Ответ 2
Я удивлен, что он не просто полностью не работает - вы пытаетесь передать каждый результат в IRegion
, но вы генерируете экземпляры анонимного типа, которые, безусловно, не будут реализовывать IRegion
.
У вас есть конкретный тип, который реализует IRegion
?
Ответ 3
Приведение в IRegion
не будет работать. Вы выбираете анонимный тип, который не будет реализовывать IRegion
. Есть ли способ создать экземпляр чего-то, что реализует IRegion?
Ответ 4
Возможно, вам нужно что-то вроде этого:
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();
}
Ответ 5
Возможно, вам нужно что-то вроде этого:
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();
}