很难解释,但是这里......我们正在使用一个返回动态列的过程, 即列标题是日期,列数可以是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<TableColumn> ltc = new List<TableColumn>();
List<List<TableColumn>> lltc = new List<List<TableColumn>>();
using (SqlDataReader rdr = (SqlDataReader)Database.ExecuteReader(com))
{
while (rdr.Read())
{
// If new ID or ID doesnt == the previous then create a new row
if (oc == "" || oc != rdr["Type"].ToSafeString())
{
if (oc != "")
{
lltc.Add(ltc);
ltc = new List<TableColumn>();
}
}
ltc.Add(new TableColumn(rdr["Column"].ToSafeString(), rdr["Data"].ToSafeString());
oc = rdr["type"].ToSafeString();
}
}
该过程可以返回相当数量的数据(例如,8行中的288列)
时间明智,它需要大约1.5秒才能从数据库返回数据,然后再用1.2秒通过数据读取器实际创建列表列表。
我的问题是,有没有更有效的方法来处理这个问题?因为创建模型的1.2 +秒分钟似乎很长..数据实际上将作为表格显示在前端。
添加,这是一个Web API MVC 4应用程序。
任何建议将不胜感激。
答案 0 :(得分:1)
我已经按如下方式处理了这个场景:
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; }
}
然后创建一个View以呈现ColumnModel:
@model ColumnModel
<td>
@Html.DisplayFor(m => m.ColumnLabel)
@Html.HiddenFor(m => m.ColumnName)
</td>
GridRow:
@model GridRow
<tr>
<!-- loop through GridRow.VisibleFields to render TDs -->
</tr>
最后是一个GridModel:
@model GridModel
<table>
<thead>
<tr>
@Html.DisplayFor(m => m.Columns)
</tr>
</thead>
<tbody>
@Html.DisplayFor(m => m.Rows)
</tbody>
</table>
这将支持任意数量的列。要处理字段格式等,您可以将元数据附加到ColumnModel对象,并在渲染GridRows时引用关联的元数据
答案 1 :(得分:0)
免责声明:我从来没有真正做到这一点,我不知道它是否会起作用或更快,它只是在我阅读你的帖子时想到的。
而不是创建数据列表和内容。尝试为要显示的每一行创建List<dynamic>
,创建一个新的ExpandoObject
作为IDictionary<string, string>
(假设所有值都是字符串),然后将每个属性动态添加到对象。
现在为每个属性创建网格标题,并使用List<dynamic>
作为数据源。
创建行的代码和添加属性看起来像这样......
var row = new ExpandoObject() as IDictionary<string, string>;
row.Add("PropertyName", "value");