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