¿EF6 alpha async aguarda en una entidad almacenada procedimiento / función de importación?

async-await c#-5.0 entity-framework entity-framework-6

Pregunta

Me gustaría aplicar la nueva funcionalidad async await a los procedimientos almacenados / importaciones de función importadas en mi modelo de entidad, pero aún no he podido con el alfa EF6.

¿Es posible en EF6 alpha2 (o en la compilación nocturna a partir de 20211) llamar a cualquiera de los nuevos métodos Async en una importación de función de entidad (que llama a un procedimiento almacenado de SQL) que devuelve una colección de tipo complejo? p.ej

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 cualquiera de los nuevos métodos modificados asíncronos no parecen estar disponibles para la Importación de función / procedimiento almacenado de entidad anterior; solo están disponibles los métodos estándar "ToList" o "AsNumerable", etc.

Seguí esto ( http://entityframework.codeplex.com/wikipage?title=Updating%20Applications%20to%20use%20EF6 ) para asegurarme de que el código hace referencia a las nuevas dlls de EF6 y no a EF5, así como a las diferentes declaraciones Aparte de lo anterior, todo se construye correctamente. (.NET Framework 4.5)

La única vez que puedo ver los métodos asíncronos es si, en lugar de importar solo los procedimientos almacenados desde la base de datos, también importo una tabla; luego, cuando hago referencia a esa tabla a través del contexto de Entidad como antes (context.SomeTable), algunos de los métodos asíncronos Aparecen en intellisense.

Realmente me gustaría comenzar a usar la nueva funcionalidad async await en varios procedimientos almacenados antes de devolver los datos como JSON, pero no he podido hacerlo funcionar hasta el momento.

¿Estoy haciendo algo mal? ¿No es posible la funcionalidad asíncrona en las importaciones de función / procedimiento almacenado de Entidad? Gracias por su consejo.

Respuesta aceptada

Ahora, esta no es la mejor solución. Agregué un método de extensión para poder llamar a la espera en mis procedimientos almacenados. En las nuevas versiones de EF6.1 + deberíamos ver esto implementado oficialmente. Hasta entonces, un método de extensión ficticia hace el trabajo.

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

Si refleja la versión 6 de EF, verá que ObjectResult<T> implementa realmente IDbAsyncEnumerable<T>, IDbAsyncEnumerable . Y el método para ToListAsync<T>(this IDbAsyncEnumerable<T> source) debería poder conectarlo de la misma manera que una consulta LINQ.

Editar Cuando el ObjectResult está vacío se devuelve un nulo. Podría agregar if (source == null) return new List<T>(); si desea devolver una lista vacía en lugar de nula.


Respuesta popular

Este es un hilo viejo, pero sentí que debería compartir. Debe usar APM y luego ajustar las llamadas síncronas en una tarea.

Ejemplo:

//declare the delegate
private delegate MyResult MySPDelegate();

// declare the synchronous method
private MyResult MySP()
{
    // do work...
}

Luego envuelva el método síncrono en una tarea:

//declare the delegate
private delegate MyResult MySPDelegate();

// declare the synchronous method
private MyResult MySP()
{
    // do work...
}

Llame al método asíncrono cuando quiera ejecutar:

//declare the delegate
private delegate MyResult MySPDelegate();

// declare the synchronous method
private MyResult MySP()
{
    // do work...
}

Puede usar hasta tres (3) parámetros en los métodos. La mejor práctica es si usa más de tres parámetros; deberías pasar en una clase.




Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué