2010-08-23 60 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()); 
    }