带有DataTable源的.NET MVC Webgrid

时间:2013-10-02 12:28:35

标签: c# asp.net-mvc datatable webgrid

我有一个MVC应用程序,我需要能够在视图中显示各种记录。为此,我走了使用内置Webgrid控件的路线。我遇到的问题是从数据库中返回数据并将其转换为网格的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?

3 个答案:

答案 0 :(得分:0)

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

var result = dt.AsEnumerable();

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

答案 1 :(得分:0)

这个问题似乎与我刚刚回答的asp.net mvc 3 webgrid bound to List<dynamic> is exceedingly slow重复。

答案 2 :(得分: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;
}