2010-08-23 7 views
0

j'aipar défaut EF générés classes et JSON

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

Ce sont par défaut EF généré des objets.

Je veux transformer cela en chaîne JSON containt toutes les voitures, chacune avec ses roues, et chaque roue avec ses écrous, tout comme je le ferais de requête.

On dirait que récupérer une classe anonyme à partir de la requête est une solution, mais je ne sais pas comment obtenir une classe anon profonde à 3 niveaux.

Des suggestions? De nouveaux cadres qui accomplissent cela?

Merci beaucoup --MB

Répondre

2

Je vous recommande d'utiliser la méthode 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

Merci, ça fonctionne assez bien. D'autres réponses pourraient fonctionner aussi bien mais celle-ci est assez bonne et assez facile. J'ai une autre question -> pouvez-vous formater JavaScriptSerializer json pour être lisible par l'homme? Ou sinon, pouvez-vous suggérer json.net pour cela, semble que je pourrais l'utiliser de la même manière? Merci –

0

Vous pouvez utiliser la carte pour AutoMapper facilement de vos objets EF à un ViewModel puis retourner que ViewModel comme JSON. Vous définiriez votre ViewModel quelque chose comme ceci:

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/ 
} 

Vous ne comprendrait que les propriétés des choses dont vous avez besoin dans votre JS au lieu de toutes les colonnes de chaque table. Ensuite, vous obtenez votre liste d'objets Car d'EF comme vous l'avez fait et vous mappez de celle-ci à CarsViewModel en fonction de votre configuration AutoMapper et renvoyez le modèle CarsViewModel en tant que propriété Data de votre JsonResult.

0

vous pouvez utiliser quelque chose de façon simple comme celui-ci dans la vue:

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