2017-02-28 1 views
0

Wie konvertiere ich von IQueryable zu IEnumerable? Ich schaute auf einen anderen Beitrag Get from IQueryable to IEnumerable, aber es ist nicht generisch genug, um wieder zu verwenden? Kann jemand eine generische wiederverwendbare Weise zur Verfügung stellen?Konvertieren von IQueryable zu IEnumerable

public class SoftwareProductRepository 
{ 
    BitDatabaseEntities bitDB = new BitDatabaseEntities(); 
    public IEnumerable<BuildMetrics> GetBuildMetrics() 
    { 

     var list = (from r in bitDB.bit_sanity_results select r); 

     return list; 
    } 
} 

Fehlermeldung:

Kann nicht implizit converty Typ 'System.Linq.IQueryable<Dashboard.EntityFramework.bit_sanity_results>' zu 'System.Collections.IEnumerable<Dashboard.Model.ApiModels.BuildMetrics>' .Ein explizite Konvertierung vorhanden ist (möglicherweise fehlt eine Guss?)

+0

Haben Sie diesen Thread überprüft: http://stackoverflow.com/questions/ 14842176/convert-an-iqueryable-linq-abfrage-zu-iienerablet-cancels-out-linq-optimized-wa –

+0

versuchen Sie '.T oEnumerable() '. – TheVillageIdiot

+0

Der VillateIdiot - wo genau? – user3508811

Antwort

3

Versuchen abfragbar zu enumerable mit dieser Umwandlung:

(from r in bitDB.bit_sanity_results select r).AsEnumerable(); 

Dies wird Ihnen eine zählbare Sammlung geben, aber ich glaube, Sie können BuildMetrics Objekte aus bit_sanity_results zu erzeugen, haben gezeigt, dass werden dadurch zurückgegeben. Wie:

(from r in bitDB.bit_sanity_results select new BuildMetrics{ 
     <some BuildMetrics property>=r.<some bit_sanity_results property> 
     }).AsEnumerable(); 

Beispiel

public class ReturnClass 
{ 
    public string SSId{get;set;} 
    public string Name{get;set;} 
} 

Tabelle, aus denen wir wählen:

table values_store 
(
    ss_id varchar(50), 
    user_name varchar(250) 
) 

public class ReturnValuesRepository 
{ 
    public IEnumerable<ReturnClass> GetReturnClasses() 
    { 
     //As commented by @Enigmativity if your `BitDatabaseEntities` is `IDisposable` (sure if it inherits from `DbContext`) you should wrap it in a `using` block 
     using(var db = new ValuesEntities()) 
     { 
      var list = (from r in db.values_store select new 
        ReturnClass 
        { 
         SSId=r.ss_id, 
         Name=r.user_name 
        }).AsEnumerable(); 

      return list; 
     } 
    } 
} 
+0

dies wirft einen Fehler '" kann nicht implizit konvertieren Typ 'System.Collections.Generic.List ' .Eine explizite Konvertierung ist vorhanden. – user3508811

+0

Ich weiß nicht, welche Eigenschaften in 'bit_sanity_results' oder' BuildMetrics' Klassen vorhanden sind. Aber Sie erhalten eine Idee, die Sie brauchen, um Objekte in 'select' zu erstellen. – TheVillageIdiot

+2

@TheVillageIdiot - Sie können 'var' nicht als Variablendeklaration auf Klassenebene verwenden. – Enigmativity

1

Die Umwandlung in dieser Der Fall sollte eigentlich implizit wie IQueryable<T> implements IEnumerable<T> sein.

Ihr Problem hier ist ein Typ stimmt nicht überein, da Sie IQueryable<bit_sanity_results> bekommen, aber versuchen, IEnumerable<BuildMetrics> zurückzugeben.

Sie müssten die IQueryable<bit_sanity_results> zu IEnumerable<BuildMetrics> projizieren.

Etwas wie folgt aus:

public class SoftwareProductRepository 
{ 
    BitDatabaseEntities bitDB = new BitDatabaseEntities(); 
    public IEnumerable<BuildMetrics> GetBuildMetrics() 
    { 
     return bitDB.bit_sanity_results.Select(r => new BuildMetrics(...)); 
    } 
} 
+0

dies wirft einen Fehler "kann nicht implizieren Typ" System.Collections.Generic.List "konvertieren Konvertierung existiert – user3508811

+1

@ user3508811 also Sie nicht genau dieses Beispiel verwenden.Dies ist der richtige Weg zu tun, was Sie wollen.Wenn Sie so etwas tun, wie List myList = GetBuildMetrics() 'es wird den Fehler Sie werfen sagte. – Alisson

Verwandte Themen