【问题标题】:most efficient way to send dynamic columns发送动态列的最有效方式
【发布时间】:2014-02-28 15:37:29
【问题描述】:

很难解释,但是这里有……我们目前正在使用一个返回动态列的过程, 即列标题是日期,列数可以是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 + seconds min 似乎很长.. 数据实际上会以表格的形式显示在前端。

补充一下,这是一个 Web API MVC 4 应用程序。

任何建议将不胜感激。

【问题讨论】:

  • 这称为Pivoting,可以在SQL中完成
  • 是的,但是,如果将数据作为普通表返回,则无法创建模型,因为我们不知道返回了多少列,它们是动态的,我想我'我说得对吗..?
  • 我必须承认我不是一个 ASP 人,我来自 winforms。但是您可以肯定地在 ASP.NET 中绑定一个网格(并且它可以自动填充列)。您可以返回 DataTable 并将 UI 网格绑定到它。
  • 如果数据层返回一个数据表,并且您只需绑定到该调用即可。但是,我们的应用程序在 web api 中收集数据,将其放入 API 模型,然后传递使用 JSON 到前端,但是构建该模型需要遍历数据,这似乎几乎与 sp 获取它所需的时间一样长..
  • 在 SQL 端透视数据,然后将数据绑定到 datagrid。换句话说,首先让 SQL 以您需要的格式生成数据。

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


【解决方案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 时引用关联的元数据

【讨论】:

【解决方案2】:

免责声明:我从未真正这样做过,我不知道它是否会起作用或更快,这正是我阅读您的帖子时想到的。

而不是创建数据列表和东西列表。尝试创建一个List&lt;dynamic&gt;,对于要显示的每一行,创建一个新的ExpandoObject 作为IDictionary&lt;string, string&gt;(假设您的所有值都是字符串),然后将每个属性动态添加到对象中。 现在为这些属性中的每一个创建网格标题,并使用List&lt;dynamic&gt; 作为您的数据源。

创建行和添加属性的代码如下所示...

var row = new ExpandoObject() as IDictionary<string, string>;
row.Add("PropertyName", "value");

【讨论】:

    猜你喜欢
    • 2011-02-01
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    • 2013-11-07
    • 2011-04-01
    相关资源
    最近更新 更多