2017-10-24 8 views
0

モデルなしのようにカラム定義を使用せずにストアドプロシージャの結果を取得できるコントローラを作成しようとしています。ループを使用した動的モデルクラスの作成

私は列名を取得できたら、そのモデルを作成し、モデルを使ってストアドプロシージャを呼び出すことができます。しかし、ループでモデルを作成することはできませんでした。その考え方でモデルを作成する方法はありますか?

または、ストアドプロシージャからモデルなしで結果セットを取得する考えですか?

私はoDataライブラリを使用していますので、それが可能なら素晴らしいでしょう。

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 
     } 

    } 
} 

答えて

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

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

+0

実際に私は何かが誤解だと思います。戻り値としてコードに見られるようにReturnValuesがあります。私はそれを下のモデルクラスに送信する必要があり、新しいMODEL構造を作成する必要があります。 のようなもの [列( "COLUMN1")] public int COLUMN1 {get;セット; } [列( "COLUMN2")] 公開ストリングCOLUMN2 {get;セット; } 私はそれをクラスに送信して上記のようなモデルを作成できませんでした... –

+0

結果のデータからクラスを動的に作成したいですか? –

+0

はいいいえ –

0

あなたはSystem.DynamicからExpandoObjectを使用することができます。ここで

は作業例です:

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

ここで重要なの私たちがそのExpandoObjectに追加呼び出すとき、実際にそのオブジェクトのプロパティとして、これらの値を追加するために起こっているということです。かなり元気!

0

実際に何かが間違っていると思います。戻り値としてコードに表示されているように私はReturnValuesを持っています。私はそれを下のモデルクラスに送信する必要があります。 新しいMODEL構造体を作成します。

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

よう

何かだから私はクラスに送信し、上記のようなモデルを作成することができませんでした。..

関連する問題