Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 发送动态列的最有效方法_C#_Sql_.net_Asp.net Mvc_Ado.net - Fatal编程技术网

C# 发送动态列的最有效方法

C# 发送动态列的最有效方法,c#,sql,.net,asp.net-mvc,ado.net,C#,Sql,.net,Asp.net Mvc,Ado.net,很难解释,但这是。。。我们目前正在处理一个返回动态列的过程, ie列标题是日期,列数可以是x Type 12/12/2014 19/12/2014 26/12/2014 1 2 3 1 2 5 4 3 使用数据读取器处理此问题的最佳方法是什么。 目前,数据库团队以当前格式返回数据,列是动态的,我

很难解释,但这是。。。我们目前正在处理一个返回动态列的过程, ie列标题是日期,列数可以是x

 Type          12/12/2014    19/12/2014    26/12/2014
   1                2             3             1
   2                5             4             3 
使用数据读取器处理此问题的最佳方法是什么。 目前,数据库团队以当前格式返回数据,列是动态的,我们知道行的结束位置,新的行以类型开始,因此,类型1是一行,类型2是第二行,等等:-

column         data     Type
12/12/2014       2        1
19/12/2014       3        1
26/12/2014       1        1
12/12/2014       5        2
19/12/2014       4        2
26/12/2014       3        2
在.net应用程序中,我们建立了一个列表列表(表示列和行)

List ltc=new List();
List lltc=新列表();
使用(SqlDataReader rdr=(SqlDataReader)Database.ExecuteReader(com))
{
while(rdr.Read())
{
//如果新ID或ID不==上一个,则创建一个新行
如果(oc==“”| | oc!=rdr[“Type”].ToSafeString())
{
如果(oc!=“”)
{
lltc.Add(ltc);
ltc=新列表();
}
}
添加(新的TableColumn(rdr[“Column”].ToSafeString(),rdr[“Data”].ToSafeString());
oc=rdr[“类型”]。ToSafeString();
}
}
该过程可以返回相当数量的数据(例如,8行上有288列)

就时间而言,从数据库返回数据大约需要1.5秒,然后再花1.2秒通过数据读取器实际创建列表

我的问题是,有没有更有效的方法来处理这个问题?因为创建模型的时间似乎很长,至少需要1.2秒。数据实际上会以表格的形式显示在前端

这是一个WebAPI MVC4应用程序


任何建议都将不胜感激。

免责声明:我从来没有这样做过,我不知道它是否有效或更快,这正是我读你的帖子时想到的

不要创建数据和内容列表。尝试创建一个
列表
,对于要显示的每一行,创建一个新的
ExpandoObject
,作为
IDictionary
(假设所有值都是字符串),然后将每个属性动态添加到对象中。 现在为这些属性中的每一个创建网格头,并使用
列表
作为数据源

创建一行并添加属性的代码如下所示

var row = new ExpandoObject() as IDictionary<string, string>;
row.Add("PropertyName", "value");
var row=newexpandoobject()作为IDictionary;
添加(“PropertyName”、“value”);

我已按如下方式处理此场景:

        Col1    Col2    Col3    Col4
Row1    val11   val12   val13   val14
Row2    val21   val22   val23   val24
Row3    val31   val32   val33   val34
视图模型看起来像:

class GridModel 
{
    public ColumnModel[] Columns { get; set; }
    public GridRow[] Rows { get; set; }
}
class ColumnModel
{
    public string ColumnName { get; set; }
    public string ColumnLabel { get; set; }
    // other relevant column metadata for sorting, formatting, etc
}
class GridRow
{
    public string[] HiddenFields { get; set; }
    public string[] VisibleFields { get; set; }
}
然后创建视图以渲染ColumnModel:

@model ColumnModel
<td>
    @Html.DisplayFor(m => m.ColumnLabel)
    @Html.HiddenFor(m => m.ColumnName)
</td>
@model-ColumnModel
@DisplayFor(m=>m.ColumnLabel)
@Html.HiddenFor(m=>m.ColumnName)
网格:

@model GridRow
<tr>
    <!-- loop through GridRow.VisibleFields to render TDs -->
</tr>
@model GridRow
最后是一个网格模型:

@model GridModel

<table>
    <thead>
        <tr>
        @Html.DisplayFor(m => m.Columns)
        </tr>
    </thead>
    <tbody>
        @Html.DisplayFor(m => m.Rows)
    </tbody>
</table>
@model GridModel
@DisplayFor(m=>m.Columns)
@DisplayFor(m=>m.Rows)

这将支持任意数量的列。若要处理字段格式等,您可以将元数据附加到ColumnModel对象,并在呈现网格行时引用关联的元数据

这称为
数据透视
,可以在SQLyes中完成,但是,如果数据作为普通表返回,则将是强制的创建一个模型是可能的,因为我们不知道返回了多少列,它们是动态的,我想我这样说是正确的….?我必须承认我不是ASP的人,我来自winforms。但是你肯定可以绑定一个网格(它可以自动填充列)在ASP.NET中,您可以返回一个
数据表
,并将UI网格绑定到该表。如果数据层返回一个数据表,您只需绑定到该调用即可。但是,我们的应用程序在web api中收集数据,将其放入api模型,然后使用JSON将其传递到前端,但构建该模型需要循环数据,这似乎与sp获取数据所需的时间差不多..在SQL端对数据进行透视,然后将数据绑定到datagrid。换句话说,获取SQL以先生成所需格式的数据。顺便说一句,这假设您从SQL中获取数据时没有当前使用的透视数据库,那么如何填充模型从数据访问层使用sqlDatareader?我不在计算机前显示一些代码,但您将像这样读取列名:并获取值:
@model GridModel

<table>
    <thead>
        <tr>
        @Html.DisplayFor(m => m.Columns)
        </tr>
    </thead>
    <tbody>
        @Html.DisplayFor(m => m.Rows)
    </tbody>
</table>