2010-08-23 54 views
0

EF默认生成的类和JSON

List<Car> cars = 
     from c in myContext.Cars 
     .Include("Wheels") 
      .Include("Wheels.Nuts") 
     orderby c.CarID 

这些都是EF默认生成的对象。

我想把它变成包含所有汽车的JSON字符串,每个汽车都有它的车轮,每个车轮都带有螺母,就像我从查询中得到的一样。

似乎从查询中取回匿名类是一种方式,但我不知道如何获得3级深的匿名类?

有什么建议吗?任何完成这个的新框架?

非常感谢 --MB

回答

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 
      }) 
     }) 
    })); 
+0

谢谢,这工作得很好。其他答案也可能工作,但这一个足够好并且足够简单。 我有一个额外的问题 - >你可以格式化JavaScriptSerializer JSON为人类可读?或者,如果没有,你会建议json.net的,似乎我可以用同样的方式吗? 谢谢 – 2010-08-23 09:58:35

0

您可以使用AutoMapper轻松地从你的EF对象一个ViewModel地图,然后返回视图模型作为您的JSON。你会定义视图模型是这样的:

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属性返回。

0

您可以用简单的方法是这样的观点:

public JsonResult GetList() 
    { 
     List<Car> cars = from c in myContext.Cars.Include("Wheels") 
     .Include("Wheels.Nuts")orderby c.CarID 
     return Json(cars.ToArray()); 
    }