IEnumerable <> в IList <> - PullRequest
       42

IEnumerable <> в IList <>

16 голосов
/ 28 апреля 2010

Я использую 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(); 
}

Возвращает список с правильным количеством элементов, но все они пусты Пожалуйста, помогите, я нахожусь в этом в течение нескольких дней

Ответы [ 5 ]

16 голосов
/ 28 апреля 2010

Ваш оператор select возвращает анонимный тип: new {c.RegionCode, c.RegionName}

Это не может быть преобразовано в IRegion - это, в основном, типизирование Duck, которое 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(); 
}
5 голосов
/ 28 апреля 2010

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

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

2 голосов
/ 28 апреля 2010

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

1 голос
/ 28 апреля 2010

Может быть, вам нужно что-то вроде этого:

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 голосов
/ 28 апреля 2010

Может быть, вам нужно что-то вроде этого:

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