2010-04-28 27 views
15

Ich verwende Linq, um meine Datenbank abzufragen und eine generische IList zurückzugeben.IEnumerable <> zu IList <>

Was auch immer ich versuchte, konnte ich ein IQueryable zu einem IList nicht umwandeln.

Hier ist mein Code.

Ich kann nicht einfacher schreiben als dies und ich verstehe nicht, warum es nicht funktioniert.

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

Dies entspricht einer Liste mit der richtigen Anzahl von Elementen zurückgibt, aber sie sind alle leer Bitte helfen Sie, ich bin jetzt bin ich

+1

Diese Frage und Antworten wirklich die Frage der Ente eingeben illustrieren, und C#/Einschränkungen Linq –

Antwort

16

Ihre select Anweisung gibt einen anonymen Typ: new {c.RegionCode, c.RegionName}

Dies kann nicht zu IRegion umgewandelt werden - die im Grunde Ente-Typisierung wäre, die C# nicht unterstützt.

Ihre Linq-Anweisung sollte einen Typ zurückgeben, der IRegion implementiert - dann sollte Ihr Code funktionieren.

Allerdings sollte es nicht laufen - die Cast<IRegion> sollte eine Laufzeitausnahme werfen.

Grundsätzlich gilt:

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

aktualisieren

der Basiswert Linq Typ IRegion implementiert dies viel einfacher sein:

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

Sie sollten nicht die 'Cast ()' jetzt brauchen, da Sie in einen konkreten Typ projizieren. –

+0

@cottsak: Ja, er wird - "IList " ist invariant. –

+0

Ich habe meine Linq automatisch generierte Klasse Region, die IRegion implementiert. Wenn ich es verwende, bekam ich eine andere Fehlermeldung Explizite Konstruktion des Entitätstyps "xxxx.LinqToSql.xxxx.Region" in Abfrage ist nicht erlaubt. – nachid

5

überrascht es andernfalls nicht nur vollständig mit diesem für ein paar Tage bloqued - Sie versuchen, jedes Ergebnis in eine IRegion zu konvertieren, aber Sie generieren Instanzen eines anonymen Typs, der IRegion sicherlich nicht implementieren wird.

Haben Sie haben einen konkreten Typ, der IRegion implementiert?

+3

vielleicht Die richtige Anzahl von Elementen war 0 – Jimmy

2

Die Besetzung zu IRegion won‘ t arbeiten. Sie wählen einen anonymen Typ aus, der IRegion nicht implementiert. Gibt es eine Möglichkeit, eine Instanz von etwas zu erstellen, das IRegion implementiert?

1

Vielleicht brauchen Sie etwas wie folgt aus:

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

Ich brauche irgendwie in IRegion zu werfen, bevor ich meine Abfrage zurückgeben Der Compiler beklagt, dass es IList zu IList nicht konvertieren kann nachid

+0

Skeet ist richtig. Sie müssen die 'Cast ()' –

0

Vielleicht brauchen Sie etwas wie folgt aus:

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

landete ich tun dies public IList getRegionList (string country) {var query = up von c in Database.RegionDataSource wo (c.CountryCode == Länderkennung) orderby c.Name wählen c; return query.Cast () .ToList(); } Ich werde bald wieder hier sein und Sie wissen lassen Danke für Ihre wertvolle Hilfe – nachid

Verwandte Themen