none
Retornar Json de 2 tablas RRS feed

  • Pregunta

  • Hola, quisiera crear un JsonResult que me retorne los datos de 2 entidades que están relacionadas de 1 a muchos. Algo así:

    public class Image {
       //Propiedades
    }
    
    public class Pet{
       List<Image> images {get; set;}
       //Propiedades
    }

    En la base de datos obviamente están relacionadas, la tabla Image tiene un IdPet.

    Creé un ViewModel llamado PetViewModel:

        public class PetViewModel{
            public IEnumerable<Pet> pets { get; set; }
        }

    Y estoy trabajando con repositorios:

            protected IPetRepository petRepository;
            protected IImageRepository imageRepository;

    Entonces lo que debo hacer es crear un PetViewModel y pasarle los datos de petRepository e imageRepository pero debo relacionar estas 2 tablas al pasar esos datos al ViewModel y despues al JsonResult, pero lo que tengo problemas es al pasarle las images a cada pet, como puedo hacer ese tipo de búsqueda ?

    Gracias.


    sábado, 5 de diciembre de 2015 1:06

Respuestas

  • >>A circular reference was detected while serializing an object of type

    porque haces un return de PetList(); como metodo ? porque los ()

    solo debes devolver la variable

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Erick Salazar domingo, 6 de diciembre de 2015 3:35
    sábado, 5 de diciembre de 2015 15:05

Todas las respuestas

  • hola

    >>Entonces lo que debo hacer es crear un PetViewModel y pasarle los datos de petRepository e imageRepository pero debo relacionar estas 2 tablas

    pero que codigo usas en PetRepository  ? usas linq

    porque si es asi podrias crear una query que devuelva la mascota con sus imagenes en una sola query

    si las tablas estan relacionadas entonces no creas dos repositorios sin conexion, sino que defines

    interfaces IPetRepository {

        List<Pet> ObtenerTodas();

        List<Pet> ObtenerTodasConImagenes();

    }

    entonces devuelves la lista de mascotas y sus imagenes tambien

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    sábado, 5 de diciembre de 2015 1:58
  • Hola Leandro

    Capto tu idea, pero sigo algo confundido. Supongamos que implemento las interfaces que me diste de ejemplo:

    List<Pet> ObtenerTodas(){

    return context.pets.Tolist();

    }

    y la otra seria como:

    List<Pet> ObtenerTodasConImagenes(){

    List<Pet> PetList = context.Pets.Tolist();

    PetList.ForEach(p => p.images = context.Images.Where(i => i.PetId == p.PetId));

    return PetList();

    }

    No se si te refieres a algo así (no lo he probado), porque con LinQ la verdad no se como acceder hasta la lista de imagenes de la tabla Pet e igualarla a la tabla de imágenes.

    Ya probé y al parecer si hace lo que necesito, pero me da un problema de referencia circular: 

    A circular reference was detected while serializing an object of type 'System.Data.Entity.DynamicProxies.Pet_F5A38186418DCF163B12ADD49F07DF3FDC0A85B94FAD3467DFBBB47F4F77ADBF'.

    Investigué un poco y al parecer es por devolver un Json de varios niveles, si sabes alguna solución a esto te agradecería mucho

    Listo, ya logre resolver el problema utilizando Json.net, pero ahora tengo otro problema. Al convertir los datos por medio de json.net no puedo utilizar un jsonresult porque devuelve la informacion con caracteres "/n/r", lo intenté con un string y si funciona pero obviamente el navegador no lo toma como json:

            public string GetPets()
            {
                return JsonConvert.SerializeObject(petRepository.GetPets(),
                    Formatting.None,
                    new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore });
            }

    Ocupo poder pasar un Jsonresult con el dato que devuelve esa conversión que retorna una string ya en formato json.


    sábado, 5 de diciembre de 2015 3:01
  • hola

    si usas entity framewor recuerda que puedes usar el include()

    List<Pet> PetList = context.Pets.Include(x=> x.Images).Tolist();


    de esta forma tendras la lista de pet y las imagenes tambien, pero debes relacionar las entidades cuando defines el mapping

    Loading Related Entities

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    sábado, 5 de diciembre de 2015 15:04
  • >>A circular reference was detected while serializing an object of type

    porque haces un return de PetList(); como metodo ? porque los ()

    solo debes devolver la variable

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Erick Salazar domingo, 6 de diciembre de 2015 3:35
    sábado, 5 de diciembre de 2015 15:05
  • Hola Leandro!

    Gracias! No tenía ni idea de que era Lazy Loading, tampoco sabía que podía hacer esa relación en CodeFirst y eso era lo que me estaba dando tanto problema. Enserio muchas gracias, no tienes idea lo mucho que he aprendido. 

    domingo, 6 de diciembre de 2015 3:35