2010-04-28 7 views
15

Я использую Linq для запроса моей базы данных и возврата общего IList.IEnumerable <> to 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 с этим в течение нескольких дней теперь

+1

Этот вопрос действительно иллюстрируют проблему утиной типизации, и C#/ограничения Linq –

ответ

16

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

Update

Если базовый тип 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(); 
} 
+1

Теперь вам не нужно 'Cast ()', когда вы проектируете конкретный тип. –

+0

@cottsak: Да, он будет - 'IList ' является инвариантным. –

+0

У меня есть класс автогенерации Linq, который реализует IRegion. Когда я его использую, я получил еще одно сообщение об ошибке Явное построение типа объекта «xxxx.LinqToSql.xxxx.Region» в запросе недопустимо. – nachid

5

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

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

+3

возможно правильное количество элементов было 0 – Jimmy

2

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

1

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

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

Мне нужно как-то отдать в IRegion, прежде чем я верну свой запрос Компилятор жалуется, что он не может преобразовать IList в IList nachid

+0

Скит является правильным. Вы нуждаетесь в 'Cast ()' –

0

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

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

я в конечном итоге делает это общественного IList GetRegionList (строка COUNTRYCODE) {вар запрос = от с в Database.RegionDataSource где (c.CountryCode == COUNTRYCODE) OrderBy c.name выберите с; return query.Cast () .ToList(); } Я скоро вернусь и дам вам знать Спасибо за вашу ценную помощь – nachid

Смежные вопросы