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

Это возвращает список с правильным количеством объектов, но они все пусты, помогите, я - bloqued с этим в течение нескольких дней теперь

16
задан Lieven Keersmaekers 28 April 2010 в 09:01
поделиться

5 ответов

Ваш оператор 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(); 
}
16
ответ дан 30 November 2019 в 21:45
поделиться

Может вам понадобится что-то вроде этого:

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(); 
}
1
ответ дан 30 November 2019 в 21:45
поделиться

Я удивлен, что он не просто полностью потерпел неудачу - вы пытаетесь преобразовать каждый результат в IRegion , но вы создание экземпляров анонимного типа, что, конечно же, не будет реализовывать IRegion .

У вас есть конкретный тип, реализующий IRegion ?

5
ответ дан 30 November 2019 в 21:45
поделиться

Приведение к IRegion не работает. Вы выбираете анонимный тип, который не реализует IRegion . Есть ли способ создать экземпляр чего-то, что реализует IRegion?

2
ответ дан 30 November 2019 в 21:45
поделиться

Возможно, вам понадобится что-то вроде этого:

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();  
}
0
ответ дан 30 November 2019 в 21:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: