Comment retourner un object dynamic à partir d’une requête SQL

J’ai une situation où une collection de retour storeprocdure, mais je ne comment pas la structure d’object, car la requête est très dynamic

Une requête peut renvoyer:

Id | Lieu | MarketSegment | … n colonnes

et un autre peut revenir

Id | Représentant des ventes | Lieu | Région | … n colonnes

Je ne fais que renvoyer un “object” comme vous pouvez le voir dans le code ci-dessous. Je sais que cela ne fonctionnera pas, mais comment puis-je le configurer pour qu’il fonctionne?

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

MODIFIER:

Je ne sais pas si montrer le SP aidera quand même, sauf si je peux l’expliquer davantage.

Chaque colonne est représentée par un champ personnalisé. Les utilisateurs peuvent créer n nombres de champs personnalisés. Ainsi, si vous exécutez le SP pour User1 et qu’il dispose de 5 champs personnalisés, chaque champ personnalisé sera représenté dans les colonnes, mais si User2 possède 3 champs personnalisés, seules 3 colonnes seront représentées. Ce que je ne contrôle pas, c’est le nom du champ personnalisé et le nombre de champs personnalisés.

Vous ne pouvez pas utiliser SqlQuery pour les champs personnalisés.

Crée une requête SQL brute qui renverra des éléments du type générique donné. Le type peut être tout type dont les propriétés correspondent aux noms des colonnes renvoyées par la requête ou un type primitif simple. – MSDN

Mais vous pouvez utiliser ExecuteReader pour y parvenir.

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

Si vous savez ce que toutes les colonnes possibles pourraient être renvoyées, l’utilisation d’une classe comportant plus de propriétés que nécessaire ne pose aucun problème.

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