2016-04-09 29 views
0

Ich versuche herauszufinden, warum der erste Block des Codes aus Fehler und der zweite Block ist nicht, wenn der einzige Unterschied ist, dass der erste Task verwendet und der zweite Block ist nicht . Blickte in verschiedene Quellen, konnte aber keine klare Antwort bekommen. Kann jemand den ersten Block reparieren?Umwandlung Aufgabe <DbSet<T>> zu Aufgabe <IEnumerable <T>>

genannten Links unten aber kein Glück so weit How to cast DbSet<T> to List<T>
Why DbSet<TEntity> doesn't implement EnumerableAsync

public Task<IEnumerable<Asset>> GetAll() 
    { 
     var assets = Task.Factory.StartNew(() => _context.Books); 
     return assets; 
     // tried toList<asset>() on "return assets" as well but didnt make any difference. 
    } 


    public IEnumerable<Asset> GetAlls() 
    { 
     var assets = _context.Books; 
     return assets; 
    } 
+0

Warum Sie _context.Books in einer Aufgabe zurückkehren? Was ist ein Punkt? Es tut nichts nützliches, scheint es. – Evk

+1

Sie können einfach _context.Books innerhalb von StartNew auf (IEnumerable ) umwerfen, um Ihr unmittelbares Problem zu lösen, aber die Frage ist, warum Sie dies in erster Linie tun. – Evk

+0

@Evk Ich bin gerade mit Aufgabe im Moment vertraut. Es ist nur ein Beispiel. Ich werde dein Feedback nehmen. – Sike12

Antwort

1

zu beheben, stellen Sie einfach Ihre Aufgabe, den erwarteten Typ zurückgeben, das heißt IEnumerable<Asset>:

public Task<IEnumerable<Asset>> GetAll() 
{ 
    var assets = Task.Factory.StartNew(() => (IEnumerable<Asset>) _context.Books); 
    return assets; 
    // tried toList<asset>() on "return assets" as well but didnt make any difference. 
} 


public IEnumerable<Asset> GetAlls() 
{ 
    var assets = _context.Books; 
    return assets; 
} 
+0

Vielen Dank. Irgendwelche Vorschläge, diesen Code zu verbessern, wären sehr willkommen, da Sie erwähnt haben, dass ich das überhaupt nicht tun sollte. – Sike12

+1

Wenn Sie Books asynchron laden möchten, tun Sie einfach _context.Books.ToListAsync() (wobei ToListAsync() die Erweiterungsmethode von EF 6 ist). – Evk

+2

Wenn Sie sich selbst mit Aufgaben vertraut machen, müssen Sie auch erkennen, dass die Aufgabe in Ihrem Code sofort startet _context.Books (es macht keine Abfragen oder gar nichts, gibt nur _context.Books zurück) und wird beendet. Es macht also überhaupt keine sinnvolle Arbeit. – Evk

1

Sie im Grunde brauchen nur diese:

public async Task<IEnumerable<Asset>> GetAllAsync() 
{ 
    return await _context.Books; 
} 

Die Books von _context wäre ein IEnumerable<Asset> sein. Mit dem async/await erreichen Sie grundsätzlich das Books asynchron zu laden. Der grundlegende Unterschied zwischen dem obigen Verfahren und dem folgenden Verfahren

public IEnumerable<Asset> GetAlls() 
{ 
    var assets = _context.Books; 
    return assets; 
} 

ist, dass, wenn Sie durch das Ergebnis von GetAlls iterieren anfordert oder eine Liste erstellen, die auf diesem Ergebnis basiert, indem die ToList Methode aufrufen, werden Sie ein machen synchroner Aufruf (ein blockierender Aufruf, die aktuelle Ausführung würde eingefroren werden, bis Sie die gewünschten Ergebnisse erhalten. Während Sie im ersten Fall den Thread freigeben, in dem der GetAllAsync() aufgerufen wird und wenn die Ergebnisse verfügbar wären, würde die Ausführung Ihres Codes fortgesetzt auf einem anderen Thread oder im Thread, GetAllAsync() heißt, vorausgesetzt, dass die Daten verfügbar sind, die Moment, die angefordert werden)

+2

Wie würden Sie auf DbSet warten? Es ist nicht zu erwarten. – Evk

+0

Hallo @Christos danke für Ihre Antwort, aber wie Evk erwähnt DbSet ist nicht erwartet daher der Compiler wird sich beschweren. – Sike12

+0

hi @Evk Ich habe den gleichen Compilerfehler. – Sike12

Verwandte Themen