我有一个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?
答案 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;
}