2013-10-02 35 views
1

我有一個MVC應用程序,我需要能夠在視圖中顯示各種記錄。爲此,我走了使用內置的Webgrid控件的路線。我遇到的問題是從數據庫返回的Datatable中獲取數據,並將其轉換爲網格的IEnumerable。我碰到一個方法來到SO將其轉換爲一個類型列表動態的這似乎工作不夠好,但遇到的問題顯示的數據超過約6列時:.NET MVC Webgrid與DataTable源碼

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?

+0

這是http://stackoverflow.com/questions/17322239/asp-net-mvc-3的副本-webgrid-bound-to-listdynamic-is-extremelyly-slow,我已經回答了。 –

回答

0

如果你需要的是任何類型的IEnumerable那麼你可以使用the DataTableExtensions

var result = dt.AsEnumerable(); 

這將使你的IEnumerable<DataRow>,仍然不攜帶強類型對象的好處,但至少是IEnumerable

+0

網格將顯示「DataRow」的屬性,這不是OP需要的 – toddmo

0

這最終是非常直截了當的。請注意0​​擴展功能。

@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; 
}