EF сгенерированные классы по умолчанию и JSON - PullRequest
0 голосов
/ 23 августа 2010

У меня есть

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

Это все сгенерированные по умолчанию объекты EF.

Я хочу превратить это в строку JSON, содержащую все автомобили, каждый со своими колесами, и каждое колесо сего орехи, точно так же, как я получил бы от запроса.

Похоже, что возвращение анонимного класса из запроса - это путь, но я не знаю, как получить 3-х уровневый класс anon?

Какие-либо предложения?Какие-нибудь новые фреймворки, которые достигают этого?

Большое спасибо --MB

Ответы [ 3 ]

2 голосов
/ 23 августа 2010

Я бы рекомендовал использовать 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 голосов
/ 23 августа 2010

Вы можете использовать простой способ, например, в View:

 public JsonResult GetList()
    {
        List<Car> cars = from c in myContext.Cars.Include("Wheels")
        .Include("Wheels.Nuts")orderby c.CarID
        return Json(cars.ToArray());
    }
0 голосов
/ 23 августа 2010

Вы можете использовать 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 только свойства для вещей, которые вам нужны, а не все столбцы в каждой таблице.Затем вы получаете список объектов Car из EF, как вы это делали, и сопоставляете его с CarsViewModel на основе конфигурации AutoMapper и возвращаете CarsViewModel как свойство Data вашего JsonResult.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...