Vorrei applicare le nuove funzionalità asincrone attendo alle stored procedure / funzioni importate nel mio modello Entity, ma non sono ancora riuscito con l'EF6 alfa.
E 'ancora possibile in EF6 alpha2 (o nightly build di 20211) chiamare uno dei nuovi metodi Async su un'importazione di funzione entità (che richiama una stored procedure SQL) che restituisce una raccolta di tipo complesso? per esempio
private async Task<IList<Company>> getInfo (string id)
{
using (CustomEntity context = new CustomEntity())
{
var query = await context.customStoredProcedure(id).ToListAsync();
// ".ToListAsync()" method not available on above line
// OR ALTERNATIVELY
var query = await (from c in context.customStoredProcedure(id)
select new Company
{
Ident = c.id,
Name = c.name,
Country = c.country,
Sector = c.sector,
etc. etc....
}).ToListAsync();
// ".ToListAsync()" method or any "...Async" methods also not available this way
return query;
}
}
"ToListAsync", o uno qualsiasi dei nuovi metodi asincroni modificati, non sembrano essere disponibili per l'importazione Stored Procedure / Function; sono disponibili solo i metodi standard "ToList" o "AsNumerable".
Ho seguito questo ( http://entityframework.codeplex.com/wikipage?title=Updating%20Applications%20to%20use%20EF6 ) per assicurarmi che il codice faccia riferimento alle nuove DLL EF6 e non a EF5, nonché a aggiornare i vari utilizzi dichiarazioni. A parte sopra, tutto si costruisce correttamente. (.NET Framework 4.5)
L'unica volta in cui riesco a vedere i metodi asincroni è se invece di importare solo le stored procedure dal DB, importare anche una tabella - quindi quando si fa riferimento a tale tabella tramite il contesto Entity come sopra (context.SomeTable), alcuni dei metodi asincroni apparire in intellisense.
Mi piacerebbe davvero iniziare a utilizzare il nuovo async attendo funzionalità su più stored procedure prima di restituire i dati come JSON, ma non sono stati in grado di farlo funzionare finora.
Sto facendo qualcosa di sbagliato? La funzionalità asincrona non è possibile nella procedura memorizzata Entità / importazione delle funzioni? Grazie per il tuo consiglio.
Ora questa non è assolutamente la soluzione migliore. Ho aggiunto un metodo di estensione in modo da poter richiamare l'attesa sulle mie stored procedure. Nelle versioni più recenti di EF6.1 + dovremmo vederlo implementato ufficialmente. Fino ad allora un metodo di estensione fittizio fa il lavoro.
static async Task<List<T>> ToListAsync<T>(this ObjectResult<T> source)
{
var list = new List<T>();
await Task.Run(() => list.AddRange(source.ToList()));
return list;
}
Se rifletti la versione 6 di EF vedrai che ObjectResult<T>
implementa effettivamente IDbAsyncEnumerable<T>, IDbAsyncEnumerable
. E il metodo per ToListAsync<T>(this IDbAsyncEnumerable<T> source)
dovrebbe essere in grado di collegarlo come una query LINQ.
Modifica Quando ObjectResult è vuoto, viene restituito un valore nullo. È possibile aggiungere if (source == null) return new List<T>();
se si desidera restituire una lista vuota anziché null.
Questo è un vecchio thread, ma ho sentito che dovrei condividere. È necessario utilizzare APM, quindi racchiudere le chiamate sincrone in un'attività.
Esempio:
//declare the delegate
private delegate MyResult MySPDelegate();
// declare the synchronous method
private MyResult MySP()
{
// do work...
}
Quindi avvolgere il metodo sincrono in un'attività:
// wraps the method in a task and returns the task.
public Task<MyResult> MySPAsync()
{
MySPDelegate caller = new MySPDelegate(MySP);
return Task.Factory.FromAsync(caller.BeginInvoke, caller.EndInvoke, null);
}
Chiama il metodo asincrono quando vuoi eseguire:
var MyResult = await MySPAsync();
È possibile utilizzare fino a tre (3) parametri nei metodi. La migliore pratica è se usi più di tre parametri; dovresti passare in una classe.