none
Consulta web api com várias tabelas RRS feed

  • Pergunta

  • Tenho uma API onde fiz o mapeamento do banco pelo power tools(partindo de um banco existente) tenho duas tabelas : usuario e departamento onde tenho os sequintes relacionamentos :

    Usuario

    public virtual DEPARTAMENTO DEPARTAMENTO { get; set; }

    Departamento

     public virtual ICollection<USUARIO> USUARIO { get; set; }

    No mapeamento 

    this.HasOptional(t => t.DEPARTAMENTO)
                    .WithMany(t => t.USUARIO)
                    .HasForeignKey(d => d.dep_id);

    Minha dúvida é como faço a consulta pois fiz assim e dá erro :

    public async Task<IHttpActionResult> Get(int id)
            {
                try
                {
                  var response = await _db.USUARIO
                        .Include(x => x.DEPARTAMENTO)
                        .Where(x => x.usu_id== id)
                        .OrderBy(x => x.usu_nome).ToListAsync();


    Junior

    terça-feira, 11 de abril de 2017 15:18

Respostas

  • Você precisará alterar uma configuração do Json.Net para evitar problemas com loop de referência:

    Sugiro criar essa classe que extende ActionResult:

    public class JsonNetResult : ActionResult
        {
            public Encoding ContentEncoding { get; set; }
    
            public string ContentType { get; set; }
    
            public object Data { get; set; }
    
            public JsonSerializerSettings SerializerSettings { get; set; }
    
            public Formatting Formatting { get; set; }
    
            public JsonNetResult()
            {
                SerializerSettings = new JsonSerializerSettings();
            }
    
            public override void ExecuteResult(ControllerContext context)
            {
                if (context == null)
                    throw new ArgumentNullException("context");
    
                HttpResponseBase response = context.HttpContext.Response;
    
                response.ContentType = !string.IsNullOrEmpty(ContentType)
                  ? ContentType
                  : "application/json";
    
                if (ContentEncoding != null)
                    response.ContentEncoding = ContentEncoding;
    
                if (Data != null)
                {
                    JsonTextWriter writer = new JsonTextWriter(response.Output) { Formatting = Formatting };
                    JsonSerializer serializer = JsonSerializer.Create(SerializerSettings);
                    serializer.Serialize(writer, Data);
                    writer.Flush();
                }
            }
        }

    Daí em sua action Web API (ou MVC) você utilizá este código para retornar os dados desejados:

    return new JsonNetResult()
                {
                    Formatting = Newtonsoft.Json.Formatting.Indented,
                    Data = result,
                    SerializerSettings = new Newtonsoft.Json.JsonSerializerSettings()
                    {
                        ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
                    }
                };


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    • Marcado como Resposta Junior_luiz terça-feira, 11 de abril de 2017 17:58
    terça-feira, 11 de abril de 2017 16:32
  • Juliano, pesquisando melhor achei uma solução mais prática no webapiconfig da api coloquei isso :

    GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;


    Junior

    • Marcado como Resposta Junior_luiz terça-feira, 11 de abril de 2017 17:27
    terça-feira, 11 de abril de 2017 17:26

Todas as Respostas

  • Qual erro? Dê mais informações.

    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    terça-feira, 11 de abril de 2017 15:27
  • {"Message":"An error has occurred.","ExceptionMessage":"Self referencing loop detected with type 'Projeto.API.Models.Entities.USUARIO'. Path '[0].DEPARTAMENTO.USUARIO'.","ExceptionType":"Newtonsoft.Json.JsonSerializationException","StackTrace":"   em Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CheckForCircularReference(JsonWriter writer, Object value, JsonProperty property, JsonContract contract, JsonContainerContract containerContract, JsonProperty containerProperty)\r\n


    Junior

    terça-feira, 11 de abril de 2017 15:58
  • Você precisará alterar uma configuração do Json.Net para evitar problemas com loop de referência:

    Sugiro criar essa classe que extende ActionResult:

    public class JsonNetResult : ActionResult
        {
            public Encoding ContentEncoding { get; set; }
    
            public string ContentType { get; set; }
    
            public object Data { get; set; }
    
            public JsonSerializerSettings SerializerSettings { get; set; }
    
            public Formatting Formatting { get; set; }
    
            public JsonNetResult()
            {
                SerializerSettings = new JsonSerializerSettings();
            }
    
            public override void ExecuteResult(ControllerContext context)
            {
                if (context == null)
                    throw new ArgumentNullException("context");
    
                HttpResponseBase response = context.HttpContext.Response;
    
                response.ContentType = !string.IsNullOrEmpty(ContentType)
                  ? ContentType
                  : "application/json";
    
                if (ContentEncoding != null)
                    response.ContentEncoding = ContentEncoding;
    
                if (Data != null)
                {
                    JsonTextWriter writer = new JsonTextWriter(response.Output) { Formatting = Formatting };
                    JsonSerializer serializer = JsonSerializer.Create(SerializerSettings);
                    serializer.Serialize(writer, Data);
                    writer.Flush();
                }
            }
        }

    Daí em sua action Web API (ou MVC) você utilizá este código para retornar os dados desejados:

    return new JsonNetResult()
                {
                    Formatting = Newtonsoft.Json.Formatting.Indented,
                    Data = result,
                    SerializerSettings = new Newtonsoft.Json.JsonSerializerSettings()
                    {
                        ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
                    }
                };


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    • Marcado como Resposta Junior_luiz terça-feira, 11 de abril de 2017 17:58
    terça-feira, 11 de abril de 2017 16:32
  • Juliano, pesquisando melhor achei uma solução mais prática no webapiconfig da api coloquei isso :

    GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;


    Junior

    • Marcado como Resposta Junior_luiz terça-feira, 11 de abril de 2017 17:27
    terça-feira, 11 de abril de 2017 17:26
  • Trata-se da mesma configuração, porém aplicado para toda aplicação. Se precisar tratar referência em loop de uma forma diferente, terá que utilizar o código que eu mencionei para tratar a exceção à regra.

    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    terça-feira, 11 de abril de 2017 17:32