我有
List<Car> cars =
from c in myContext.Cars
.Include("Wheels")
.Include("Wheels.Nuts")
orderby c.CarID
这些都是EF默认生成的对象。
我想把它变成包含所有汽车的JSON字符串,每个汽车都有它的轮子,每个轮子都有它的螺母,就像我从查询中得到的那样。
似乎从查询中取回匿名类是可行的,但我不知道如何获得3级深度的anon类?
有什么建议吗?任何新的框架可以实现这一目标吗?
非常感谢 --MB
答案 0 :(得分:2)
我建议使用JavaScriptSerializer.Serialize方法:
new JavaScriptSerializer().Serialize(myContext.Cars.OrderBy(c => c.CarID).
Select(c => new
{
id = c.CarID,
vin = c.VIN,
wheels = c.Wheels.Select(w => new
{
id = w.WeelID,
nuts = w.Nuts.Select(n => new
{
id = n.NutID
})
})
}));
答案 1 :(得分:0)
您可以使用AutoMapper轻松地从EF对象映射到ViewModel,然后将该ViewModel作为Json返回。你可以像这样定义你的ViewModel:
public class CarsViewModel
{
public IList<Car> Cars { get; set; }
public class Car
{
public int CarId { get; set; }
public string Name { get; set; }
// other stuff here
public IList<CarsViewModel.Wheel> Wheels { get; set; }
}
public class Wheel
{
public int WheelId { get; set; }
public string Brand { get; set; }
}
// etc. etc/
}
您只需在JS中包含所需内容的属性,而不是每个表中的所有列。然后,就像你一样从EF获取Car对象列表,并根据你的AutoMapper配置将其映射到CarsViewModel,并将CarsViewModel作为JsonResult的Data属性返回。
答案 2 :(得分:0)
你可以在View中使用这样的简单方法:
public JsonResult GetList()
{
List<Car> cars = from c in myContext.Cars.Include("Wheels")
.Include("Wheels.Nuts")orderby c.CarID
return Json(cars.ToArray());
}