发送动态列的最有效方法

时间:2014-02-28 15:37:29

标签: c# sql .net asp.net-mvc ado.net

很难解释,但是这里......我们正在使用一个返回动态列的过程, 即列标题是日期,列数可以是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应用程序。

任何建议将不胜感激。

2 个答案:

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