2010-04-28 6 views
15

Używam Linq do zapytania do mojej bazy danych i zwrócenia ogólnej IList.IEnumerable <> to IList <>

Cokolwiek próbowałem, nie mogłem przekonwertować IQueryable na IList.

Oto mój kod.

Nie mogę napisać prostniej niż to i nie rozumiem, dlaczego to nie działa.

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

ta zwraca listę z prawej liczby przedmiotów, ale wszystkie są puste Proszę o pomoc, jestem bloqued z tym przez kilka dni teraz

+1

To pytanie naprawdę zilustrowania problemu kaczka wpisywanie i C#/ograniczenia Linq –

Odpowiedz

16

Twój select instrukcja zwraca typ anonimowy: new {c.RegionCode, c.RegionName}

To nie może być przekonwertowany do IRegion - które w zasadzie być Duck-typowania, który C# nie obsługuje.

Twoja instrukcja linq powinna zwrócić typ implementujący IRegion - wtedy Twój kod powinien zadziałać.

Jednak nie powinien działać - Cast<IRegion> powinien zrzucić wyjątek środowiska wykonawczego.

Zasadniczo:

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

Aktualizacja

Jeżeli bazowy typ LINQ realizuje IRegion może to być o wiele prostsze:

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

Nie powinieneś już potrzebować 'Cast ()' teraz, gdy wyświetlasz konkretny typ. –

+0

@cottsak: Tak, będzie - "IList ' jest niezmienne. –

+0

Mam automatycznie wygenerowany region klasy Linq, który implementuje IRegion. Po uruchomieniu otrzymałem kolejny komunikat o błędzie Jawna konstrukcja typu jednostki "xxxx.LinqToSql.xxxx.Region" w zapytaniu jest niedozwolona. – nachid

5

Dziwię się to nie tylko w przypadku braku całkowitego - próbujesz rzucić każdy wynik na numer IRegion, ale generujesz wystąpienia typu anonimowego, które z pewnością nie będą implementować IRegion.

Czy masz masz konkretny typ, który implementuje IRegion?

+3

być może właściwa liczba pozycji to 0 – Jimmy

2

Obsada do IRegion won” t działa. Wybierasz anonimowy typ, który nie będzie implementował IRegion. Czy istnieje sposób na stworzenie instancji czegoś, co implementuje IRegion?

1

Może trzeba coś takiego:

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

Potrzebuję jakoś rzucić do IRegion zanim wrócę do mojego zapytania Kompilator narzeka, że ​​nie może przekonwertować IList'a na IList nachid

+0

Skeet jest poprawny. Potrzebne są 'Obsada ()' –

0

Może trzeba coś takiego:

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

skończyło się to zrobić publicznych IList GetRegionList (countryCode string) {var query = od cw Database.RegionDataSource gdzie (c.CountryCode == CountryCode) orderby c.Name wybrać do; return query.Cast () .ToList(); } Wkrótce wrócę tu i dam ci znać Dziękuję za cenną pomoc – nachid