Come restituire object dinamico dalla query SQL

Ho una situazione in cui una raccolta di resi storeprocdure, ma non come la struttura dell’object perché la query è molto dynamic.

Una query può restituire:

Id | Posizione MarketSegment | … n colonne

e un altro può tornare

Id | Rappresentante di vendita | Posizione Regione | … n colonne

Sto semplicemente restituendo un “object” come puoi vedere nel codice qui sotto. So che questo non funzionerà, ma come posso configurarlo in modo che lo faccia?

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

MODIFICARE:

Non so se mostrare la SP aiuterà in ogni caso, tranne se posso spiegarlo di più.

Ogni colonna è rappresentata come Campi personalizzati. Gli utenti sono in grado di creare n numeri di campi personalizzati. Quindi, se si esegue l’SP per Utente1 e se ha 5 campi personalizzati, ogni campo personalizzato verrà rappresentato in Colonne, ma Se Utente2 ha 3 campi personalizzati, verranno rappresentate solo 3 colonne. Quello su cui non ho il controllo è il nome campo personalizzato e il numero di campi personalizzati.

Non è ansible utilizzare SqlQuery per i campi personalizzati.

Crea una query SQL raw che restituirà elementi del tipo generico specificato. Il tipo può essere di qualsiasi tipo che abbia proprietà che corrispondono ai nomi delle colonne restituite dalla query o può essere un semplice tipo primitivo. – MSDN

Ma puoi usare ExecuteReader per farlo.

 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> items = new List>(); var reader = cmd.ExecuteReader(); while (reader.Read()) { var item = new List(); items.Add(item); for (int i = 0; i < reader.FieldCount ; i++) item.Add(reader[i]); } return Request.CreateResponse>(HttpStatusCode.OK, items); } 

Se sai cosa potrebbero essere restituite tutte le colonne possibili, non c’è alcun problema con l’utilizzo di una class che ha più proprietà del necessario.

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