使用循环

时间:2017-10-24 11:50:48

标签: c# asp.net asp.net-mvc model-view-controller odata

我正在尝试创建一个控制器,它可以获得没有列定义的存储过程结果,就像没有模型一样。

我在想如果我能获得列名,我可以为它创建一个模型并使用模型调用存储过程。但我无法创建循环模型。有没有办法用这个想法创建一个模型。

或者您是否有任何想法在没有存储过程的模型的情况下获得结果集?

我正在使用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
        }

    }
}

3 个答案:

答案 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)

实际上我觉得有些事情被误解了。我在代码中看到ReturnValues作为返回值..我需要将它发送到下面的模型类,我需要 创建新的MODEL结构;

类似

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

所以我无法将它发送到课堂并创建一个像上面那样的模型..