【发布时间】:2016-09-27 23:17:24
【问题描述】:
我正在开发一个 MVC 5 应用程序,并试图让用户编写自己的查询并在 Jquery DataTables 中显示结果。我很难弄清楚如何根据用户输入动态构建匿名 JSON 对象。
理论上,用户会发送列列表和 where 子句来构建 SQL 查询。 我会像这样运行 SQL 查询,然后构建我的对象。
如何根据用户输入的内容动态构建“select new { DT_RowId = a.id, name = a.name, number = a.number }”。
var v = (from a in dc.Products.SqlQuery(querystring) select new { DT_RowId = a.id, name = a.name, number = a.number }).ToList();
最终的 JSON 响应是
data":[{"id":56,"name":"Product 55","number":"55"}]
硬编码时效果很好。否则,我将不得不从产品中选择 *,然后在客户端显示/隐藏列,因此如果所有列都从服务器返回,则我的数据有效负载非常大。
有没有办法遍历请求的属性来构建这个匿名对象?我尝试使用字典,但是返回的 Json 非常不同,其中包含 Key 和 Value,这不是 DataTables 所期望的。
谢谢!
完整的控制器代码
using (DataTableExampleContext dc = new DataTableExampleContext())
{
var v = (from a in dc.Products.SqlQuery(querystring) select new { DT_RowId = a.id, name = a.name, number = a.number }).ToList();
recordsTotal = v.Count();
var data = v.Skip(skip).Take(pageSize).ToList();
return Json(new { draw = draw, recordsFiltered = recordsTotal, recordsTotal = recordsTotal, data = data }, JsonRequestBehavior.AllowGet);
}
感谢菲利普的解决方案
using (DataTableExampleContext dc = new DataTableExampleContext())
{
var v = (from a in dc.Products.SqlQuery(querystring) select GetResult(a, ColumnNames)).ToList();
recordsTotal = v.Count();
var data = v.Skip(skip).Take(pageSize).ToList();
return Json(new { draw = draw, recordsFiltered = recordsTotal, recordsTotal = recordsTotal, data = data }, JsonRequestBehavior.AllowGet);
}
}
public Dictionary<string,object> GetResult(Product p, List<string> columnNames)
{
var properties = TypeDescriptor.GetProperties(typeof(Product));
var dict = new Dictionary<string, object>();
foreach (var x in columnNames)
{
if (x == "id")
{
dict["DT_RowId"] = properties[x].GetValue(p);
}
else
{
dict[x] = properties[x].GetValue(p);
}
}
return dict;
}
【问题讨论】:
-
你使用的是什么 JSON 序列化器?
-
在编辑中查看我上面的完整控制器代码。我将 JSON 从控制器返回到 JQuery DataTables。但是,作为数据传回的是我在查询语句中选择的内容。这就是我想要动态定义的,这样我就不必返回 DBSet Products 中的所有列。
标签: c# jquery asp.net-mvc