C# 发送动态列的最有效方法
很难解释,但这是。。。我们目前正在处理一个返回动态列的过程, ie列标题是日期,列数可以是xC# 发送动态列的最有效方法,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 使用数据读取器处理此问题的最佳方法是什么。 目前,数据库团队以当前格式返回数据,列是动态的,我
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>