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