Mapear Stored Procedure con EF 6

Inspirado un poco en este link y pensando en una solución para poder mapear el resultado de un Stored Procedure a un objeto tipado es que se me ocurre esta humilde solución.

Entiy Framework tiene la posibilidad de ejecutar un o bien una consulta SELECT o ejecutar un Stored procedure y devolver su valor en un objeto. Ahora bien, lo mas simple es devolver un valor de un tipo primitivo (int, string, bool) como se muestra en el ejemplo del link

using (var context = new BloggingContext())
{
var blogNames = context.Database.SqlQuery(
"SELECT Name FROM dbo.Blogs").ToList();
}

Esto está muy bien pero realmente no es muy útil en un entorno real. Por eso creé este pequeño algoritmo para obtener un objeto completo y genérico de un SP enviado junto con sus parámetros.

 

  public virtual IList<T> Procedimiento_Complejo<T>(string nombreStoredProcedure, params object[] parametros)
        {
            var sqlRaw = "";
            if (string.IsNullOrEmpty(nombreStoredProcedure))
                throw new ArgumentNullException("nombreStoredProcedure");

            sqlRaw = nombreStoredProcedure.Trim() + " ";
            sqlRaw = parametros.Aggregate(sqlRaw, (current, item) =&gt; current + (" @" + item + ","));
            sqlRaw = sqlRaw.Remove(sqlRaw.Length - 1);

            //chequeo que exista el SP
            var query = Contexto.Database.SqlQuery(
                        typeof(int), string.Format("SELECT COUNT(*) FROM [sys].[objects] WHERE [type_desc] = 'SQL_STORED_PROCEDURE' AND [name] = '{0}';", nombreStoredProcedure), new object[] { });
            int existe = query.Cast<int>().Single();
            if (existe == 0)
                throw new ArgumentException("nombreStoredProcedure"); //no existe el SP en la base

            return Contexto.Database.SqlQuery<T>(sqlRaw, parametros).ToList();
       }

El código en si es bastante simple, realiza una concatenación de los parámetros enviados y hace un chequeo de que el SP exista en la base. Hacer la función genérica me permite usarla con cualquier objeto, tanto complejo como primitivo, que se requiera.
Un ejemplito Simple, rápido y reutilizable.

Saludos

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s