在C#中解析动态SQL并在ASP.Net MVC中绑定到WebGrid

在C#中解析动态SQL并在ASP.Net MVC中绑定到WebGrid我有动态SQL查询,它使用pivot来生成结果,结果集可能是这样的:

Name Div1 Div2 Div3 Div4 Div5 Active 1 0 0 0 0 Busy 0 0 0 0 1 NA 0 1 0 0 0 Suspended 0 0 0 1 0 

可以有n个分区。 我想将此数据与ASP.NET MVC WebGrid控件绑定。 我无法做到这一点。

我的C#代码如下:

 dynamic list = db.ExecuteStoreQuery("exec [dbo].[proc_GetData]").ToList(); return list; 

我想将此列表与ASP.NET MVC Webgrid绑定,我的webgrid代码如下:

 WebGrid grid = new WebGrid(Model.DataList); List list = new List(); list.Add(new WebGridColumn { Header = "Name", ColumnName = "Name" }); foreach (var item in Model.DivList) { list.Add(new WebGridColumn { Header = item, ColumnName = item }); } @grid.GetHtml(tableStyle: "webgrid", alternatingRowStyle: "webgrid-alternating-row", headerStyle: "webgrid-header", footerStyle: "webgrid-footer", selectedRowStyle: "webgrid-selected-row", rowStyle: "webgrid-row-style", columns: col); 

这个不行。 请帮助我如何完成这项任务。 谢谢。

您必须在ExecuteStoreQuery中指定类型(类和固定属性)。 您还可以使用另一种选择。 我用四个简单的步骤解释它:

1)将结果集检索到DataTable中

 private DataTable GetResultReport() { DataTable retVal = new DataTable(); EntityConnection entityConn = (EntityConnection)db.Connection; SqlConnection sqlConn = (SqlConnection)entityConn.StoreConnection; using (SqlCommand cmdReport = sqlConn.CreateCommand()) { cmdReport.CommandType = CommandType.StoredProcedure; cmdReport.CommandText = "proc_GetData"; SqlDataAdapter daReport = new SqlDataAdapter(cmdReport); using (cmdReport) { daReport.Fill(retVal); } } return retVal; } 

2)将DataTable转换为IDictionary类型的List

 private List ConvertToDictionary(DataTable dtObject) { var columns = dtObject.Columns.Cast(); var dictionaryList = dtObject.AsEnumerable() .Select(dataRow => columns .Select(column => new { Column = column.ColumnName, Value = dataRow[column] }) .ToDictionary(data => data.Column, data => data.Value)).ToList().ToArray(); return dictionaryList.ToList(); } 

3)然后循环遍历IDictionary类型的List并将其添加到List of Dynamic类型中,以便将其与webgrid绑定:

 public List GetData() { var resultset = ConvertToDictionary(GetResultReport()); var result = new List(); foreach (var emprow in resultset) { var row = (IDictionary)new ExpandoObject(); Dictionary eachRow = (Dictionary)emprow; foreach (KeyValuePair keyValuePair in eachRow) { row.Add(keyValuePair); } result.Add(row); } return result; } 

4)视图中的WebGrid绑定代码(.cshtml):

  WebGrid grid = new WebGrid(Model.OfficerOverViewList, rowsPerPage: 5); @grid.GetHtml(tableStyle: "webgrid", alternatingRowStyle: "webgrid-alternating-row", headerStyle: "webgrid-header", footerStyle: "webgrid-footer", selectedRowStyle: "webgrid-selected-row", rowStyle: "webgrid-row-style");