我正在尝试创建一个控制器,它可以获得没有列定义的存储过程结果,就像没有模型一样。
我在想如果我能获得列名,我可以为它创建一个模型并使用模型调用存储过程。但我无法创建循环模型。有没有办法用这个想法创建一个模型。
或者您是否有任何想法在没有存储过程的模型的情况下获得结果集?
我正在使用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 :(得分: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
答案 1 :(得分: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上调用Add时,它实际上会将这些值作为PROPERTIES添加到该对象上。太漂亮了!
答案 2 :(得分:0)
类似
[Column("COLUMN1")] public string COLUMN1{ get; set; }
[Column("COLUMN2")] public string COLUMN2{ get; set; }
所以我无法将它发送到课堂并创建一个像上面那样的模型..