1

我有一个 MVC 应用程序,我需要能够在视图中显示各种记录。为此,我使用了内置的 Webgrid 控件。我面临的问题是从数据库返回的 Datatable 中获取数据,并将其转换为网格的 IEnumerable。我在 SO 上遇到了一种将其转换为 List Dynamic 类型的方法,该方法似乎运行良好,但在显示超过 6 列数据时遇到了问题:

public static dynamic serializeToDynamic(DataTable dt)
    {
        var result = new List<dynamic>();
        foreach (System.Data.DataRow row in dt.Rows)
        {
            var obj = (IDictionary<string, object>)new System.Dynamic.ExpandoObject();
            foreach (System.Data.DataColumn col in dt.Columns)
            {
                obj.Add(col.ColumnName, row[col.ColumnName]);
            }
            result.Add(obj);
        }
        return result;
    }

我有一个需要显示 28 列的网格,使用这种方法非常慢,加载页面需要将近一分钟。我没有找到任何替代方案,所以我继续为这些信息制作了一个模型,并将 DataTable 绑定到这个模型,这证明在大约 2 秒内加载速度要快得多。我宁愿不必使用强类型模型来显示这些数据,我的问题是有没有其他方法可以将 DataTable 转换为与 webgrid 一起使用?

4

3 回答 3

0

这个问题似乎与绑定到 List<dynamic> 的 asp.net mvc 3 webgrid 的重复非常慢,我刚刚回答了。

于 2014-01-15T10:01:30.047 回答
0

如果您只需要IEnumerable任何类型,那么您可以使用DataTableExtensions

var result = dt.AsEnumerable();

这会给你一个IEnumerable<DataRow>,它仍然没有强类型对象的好处,但至少是一个IEnumerable.

于 2013-10-02T12:35:12.187 回答
0

这最终变得非常简单。注意With扩展功能。

@model DataTable

@{
    var columns = Model.Columns.Cast<DataColumn>().Select(c => c.ColumnName);
    var s = Model.Rows.Cast<DataRow>().Select(r => new System.Dynamic.ExpandoObject().With(columns.ToDictionary(c => c, c => r[c])));
    WebGrid grid = new WebGrid(s, rowsPerPage: 10);
  }

由于ExpandoObject是字典,您可以使用此扩展功能:

public static object With(this IDictionary<string, object> obj, IDictionary<string,object> additionalProperties)
{
  foreach (var name in additionalProperties.Keys)
    obj[name] = additionalProperties[name];
  return obj;
}
于 2017-02-12T00:27:40.570 回答