.NET MVC Webgrid with DataTable source

本文关键字:DataTable source with Webgrid MVC NET | 更新日期: 2023-09-27 18:33:38

我有一个MVC应用程序,我需要能够在视图中显示各种记录。为此,我选择了使用内置Webgrid控件的路线。我面临的问题是从数据库中返回的数据表中获取数据,并将其转换为网格的 IEnumerable。我在 SO 上遇到了一种将其转换为列表动态类型的方法,该方法似乎运行良好,但在显示超过 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 一起使用?

.NET MVC Webgrid with DataTable source

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

var result = dt.AsEnumerable();

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

这个问题似乎是 asp.net 绑定到List的mvc 3 webgrid的副本,非常慢,我刚刚回答了这个问题。

这最终非常简单。请注意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;
}