【问题标题】:.NET MVC Webgrid with DataTable source.NET MVC Webgrid 和 DataTable 源
【发布时间】:2013-10-08 20:02:37
【问题描述】:

我有一个 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 一起使用?

【问题讨论】:

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


【解决方案1】:

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

var result = dt.AsEnumerable();

这会给你一个IEnumerable&lt;DataRow&gt;,它仍然没有强类型对象的好处,但至少是一个IEnumerable。

【讨论】:

  • 网格会显示DataRow的属性,这不是OP需要的
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2011-09-04
      • 1970-01-01
      • 2011-07-21
      • 2011-08-13
      • 2017-12-14
      • 2013-01-13
      • 2013-11-24
      • 2016-01-17
      • 1970-01-01
      相关资源
      最近更新 更多