2017-10-24 4 views
0

Ich versuche, einen Controller zu erstellen, der Stored Procedure-Ergebnisse ohne Spaltendefinition wie ohne Modell erhalten konnte.Erstellen einer dynamischen Modellklasse mit einer Schleife

Ich denke, wenn ich die Spaltennamen bekommen kann, kann ich ein Modell dafür erstellen und gespeicherte Prozedur mit einem Modell aufrufen. Aber ich konnte kein Modell mit Looping erstellen. Gibt es eine Möglichkeit, ein Modell mit dieser Idee zu erstellen?

Oder haben Sie eine Idee, Ergebnis ohne Modell aus gespeicherter Prozedur zu erhalten?

Ich benutze oData-Bibliothek, so wäre es toll, wenn es das tun kann.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Http.OData; 

namespace WebService.Controllers.OData.Common 
{ 
    public class CallSPWithoutColumnDefinitionController : ODataController 
    { 
     private SitContextTuborg db = new SitContextTuborg(); 

     [EnableQuery] 
     //[SITAuthorize] 
     public IQueryable<CallSPWithoutColumnDefinitionModel> GetCallSPWithoutColumnDefinition() 
     { 
     Dictionary<string, string> parameterValues = new Dictionary<string, string>(); 
      List<CallSPWithoutColumnDefinitionModel> ReturnValues = new List<CallSPWithoutColumnDefinitionModel>(); 

      parameterValues.Add("STR_CO_NAME", "Pages"); 

      var Results = db.ExecuteProcedureWithAuth<CallSPWithoutColumnDefinitionModel>("[Load-Co-Confıg.R01]", this.Request.GetClientIp(), parameterValues).ToList(); 

      foreach (CallSPWithoutColumnDefinitionModel item in Results) 
      { 
       ReturnValues.Add(new CallSPWithoutColumnDefinitionModel() 
       { 
        LNG_ID = item.LNG_ID, 
        STR_COLL_NAME = item.STR_COLL_NAME, 
        STR_TYPE = item.STR_TYPE 
       }); 
      } 

      return ReturnValues.AsQueryable(); 
     } 
     public class tmpCallSPWithoutColumnDefinitionModel 
     { 
       //we need to create model with a for loop with Returnvalues' coll names above 
     } 

    } 
} 

Antwort

0
private static Tuple<string, object[]> PrepareArguments(string storedProcedure, object parameters) 
    { 
     var parameterNames = new List<string>(); 
     var parameterParameters = new List<object>(); 

     if (parameters != null) 
     { 
      foreach (PropertyInfo propertyInfo in parameters.GetType().GetProperties()) 
      { 
       string name = string.Format("@{0}", propertyInfo.Name); 
       object value = propertyInfo.GetValue(parameters, null); 

       parameterNames.Add(name); 
       parameterParameters.Add(new SqlParameter(name, value ?? DBNull.Value)); 
      } 
     } 

     if (parameterNames.Count > 0) 
      storedProcedure = string.Format("{0} {1}", storedProcedure, string.Join(", ", parameterNames)); 

     return new Tuple<string, object[]>(storedProcedure, parameterParameters.ToArray()); 
    } 

Von: http://code-clarity.blogspot.in/2012/02/entity-framework-code-first-easy-way-to.html

+0

eigentlich denke ich etwas falsch verstanden wird. Ich habe ReturnValues, wie Sie in Code als Rückgabewert sehen. Ich muss es an eine Modellklasse unten senden, und ich muss neue MODEL-Struktur erstellen; so etwas wie [Spalte ("COLUMN1")] public int COLUMN1 {get; einstellen; } [Spalte ("COLUMN2")] öffentliche Zeichenfolge COLUMN2 {get; einstellen; } So konnte ich es nicht zur Klasse senden und ein Modell wie oben erstellen ... –

+0

Sie möchten Klasse aus resultierenden Daten dynamisch erstellen? –

+0

ja Sie haben Recht –

0

könnten Sie ein ExpandoObject von System.Dynamic verwenden.

Hier ist ein funktionierendes Beispiel:

 DataTable tbl = new DataTable(); 
     tbl.Columns.Add(new DataColumn("hello", typeof(int))); 
     tbl.Columns.Add(new DataColumn("world", typeof(string))); 
     DataRow newRow = tbl.NewRow(); 
     newRow["hello"] = 1; 
     newRow["world"] = "boobies"; 
     tbl.Rows.Add(newRow); 

     foreach (DataRow row in tbl.Rows) 
     { 
      var expando = new ExpandoObject() as IDictionary<string, Object>; 
      foreach (DataColumn col in tbl.Columns) 
      { 
       expando.Add(col.ColumnName, row[col.ColumnName]); 
      } 
     } 

Was hier wichtig ist, ist, dass, wenn wir auf diesem ExpandoObject hinzufügen nennen, es ist eigentlich diese Werte als Eigenschaften für das Objekt hinzufügen gehen. Ziemlich schick!

0

eigentlich denke ich etwas missverstanden wird. Ich habe ReturnValues, wie Sie im Code als Rückgabewert sehen. Ich muss es an eine Modellklasse unten senden und ich muss neue MODEL-Struktur erstellen;

so etwas wie

[Column("COLUMN1")] public string COLUMN1{ get; set; } 
[Column("COLUMN2")] public string COLUMN2{ get; set; } 

So konnte ich es nicht in der Klasse senden und ein Modell wie oben schaffen ..

Verwandte Themen