Cómo devolver el object dynamic desde la consulta SQL

Tengo una situación en la que una colección de devolución de la producción de la tienda, pero no sé cómo se estructura el object porque la consulta es muy dinámica.

Una consulta puede regresar:

Id | Ubicación | MarketSegment | … n columnas

y otro puede regresar

Id | Representante de ventas | Ubicación | Región | … n columnas

Simplemente devuelvo un "object" como puede ver en el siguiente código. Sé que esto no funcionará, pero ¿cómo puedo configurarlo para que funcione?

using (DbContext db = new Context()) { var items = db.Database.SqlQuery<object>( "SP @Param1, @Param2", new SqlParameter("Param1", ped), new SqlParameter("Param2", 25) ).ToList(); return Request.CreateResponse<List<object>>(HttpStatusCode.OK, items); } 

EDITAR:

No sé si mostrar el SP me ayudará de todos modos, excepto si puedo explicarlo más.

Cada columna se representa como campos personalizados. Los usuarios pueden crear n numbers de campos personalizados. Entonces, si ejecuta el SP para el Usuario1 y tiene 5 campos personalizados, entonces cada campo personalizado se representará en Columnas, pero si el Usuario2 tiene 3 campos personalizados, solo se representarán 3 columnas. Lo que no tengo control es el nombre de campo personalizado y el número de campos personalizados.

No puede usar SqlQuery<T> para campos personalizados.

Crea una consulta SQL sin procesar que devolverá elementos del tipo genérico dado. El tipo puede ser de cualquier tipo que tenga properties que coincidan con los nombres de las columnas devueltas desde la consulta, o puede ser un tipo primitivo simple. – MSDN

Pero puedes usar ExecuteReader para lograr eso.

 using (var db = new Context()) { db.Database.Connection.Open(); var cmd = db.Database.Connection.CreateCommand(); cmd.CommandText = "SP @Param1, @Param2"; cmd.Parameters.Add(new SqlParameter("Param1", ped)); cmd.Parameters.Add(new SqlParameter("Param2", 25)); List<List<object>> items = new List<List<object>>(); var reader = cmd.ExecuteReader(); while (reader.Read()) { var item = new List<Object>(); items.Add(item); for (int i = 0; i < reader.FieldCount ; i++) item.Add(reader[i]); } return Request.CreateResponse<List<object>>(HttpStatusCode.OK, items); } 

Si conoce todas las columnas posibles que se pueden devolver, no hay problema con el uso de una class que tenga más properties de las que necesita.

 public class Data { public int ID {get;set;} public string SalesRep {get;set;}//Simply will be empty in the first example, but populated in the second. public string Location {get;set;} } 
    Intereting Posts