none
Validar que exista una propiedad (en este caso una lista) en un objeto RRS feed

  • Pregunta

  • Hola,

    Estoy trabajando en un api de C# en la parte de backend, el objetivo es insertar un registro de una lista que créditos recibida desde el lado del Frontend,

    Pero tengo el siguiente problema, yo recibo la lista de créditos, la cual contiene una sublista del historial de mora de cada crédito, el inconveniente es cuando el crédito no contiene historial de mora, la aplicación quiebra.

    A continuación, explico la lógica del código de programación:

    Yo recibo desde nivel de frontend la siguiente estructura de datos en formato JSON


    Yo para recibir esta estructura tengo dos clases Clase Mora y Clase lista_credito esta última contiene una lista del tipo de la Clase Mora

    public class Mora

        {

            public DateTime FechaReporte { getset; }

            public int AntiguedadMoraEnDias { getset; }

        }

    public class lista_credito

        {

            public string NumeroCredito { getset; }

            public decimal Cuota { getset; }

            public DateTime FechaReporte { getset; }      

            public DateTime FechaDesembolso { getset; }

            public decimal MontoAutorizado { getset; }

            public int PlazoMeses { getset; }

            public string FormaDePago { getset; }

            public decimal SaldoDeuda { getset; }

            public string EstadoOP { getset; }

            public decimal MontoVencido { getset; }

            public List<Mora>  HistorialMora { getset; }

        }

    En la parte del controlador donde declaro el endpoint yo recibo esta estructura, de la siguiente forma

    [HttpPost]

            [Route("guardar_consulta")]

            public HttpResponseMessage Guardar_Consulat_Sin_Riesgo(consulta_sin_riesgo sac)

            {…………….,

    Llamo al método que inserta la estructura y es allí donde me quiebra la aplicación

    Insertar_Lista_Credito(sac.Lista_credito_activos);

     ………….

    public void Insertar_Lista_Credito(List<lista_credito> Lista_credito)

            {

                SACContexto contexto = new SACContexto();

                foreach(var lst_cred in Lista_credito)

                {

    contexto.insertar_lista_credito(lst_cred);

                   

                   

                        foreach (var mora in lst_cred.HistorialMora)

                        {

                            contexto.insertar_historial_mora( mora, id_lista_credito);

                        }

                   

                }

                                 

                                    

            }

    El motivo es porque uno de los registros de la lista de crédito no contiene la sublista de mora

    Y al momento de realizar el segundo foreach no encuentra la propiedad lst_cred.HistorialMora y allí se quiebra el flujo,

    Yo necesito verificar si existe la propiedad lst_cred.HistorialMora   para realizar el flujo del foreach de lo contrario omitir ese flujo,

    ¿Cómo hacer para verificar o validar la existencia de esa propiedad (lst_cred.HistorialMora) por cada registro de la lista?

    De antemano agradezco su ayuda.

    miércoles, 30 de diciembre de 2020 22:08

Respuestas

  • Hola. Así tú aplicación quiebra porque en la lista HistoriaMora no venga informado (es nulo en este caso) deberías corregirlo y controlar que puede darse el caso que venga a null esa lista. También puedes establecer en el acuerdo de interfaz de tu API de backend que debe ser obligatorio enviar datos en esa lista (en ese caso la parte frontend debe modificarse para adecuarse a este requisito) . Con esto, te paso una pequeña modificación en tu bloque foreach
    foreach (var mora in lst_cred.HistorialMora.DefaultIfEmpty())
    
                        {
    
                            contexto.insertar_historial_mora( mora, id_lista_credito);
    
                        }
    Echa un ojo a Enumerable.DefaultIfEmpty Método
    O incluso, este segundo bloque foreach meterlo dentro de un bloque if preguntando si lst_cred.HistorialMora es != null

    if(lst_cred.HistorialMora?.Count > 0) // también puedes hacer lst_credw.HistorialMora != null
    {
    
    foreach (var mora in lst_cred.HistorialMora)
    {
    
                            contexto.insertar_historial_mora( mora, id_lista_credito);
    
     }
    }


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos



    jueves, 31 de diciembre de 2020 15:11
    Moderador

Todas las respuestas

  • Hola Rolando

    No estoy totalmente seguro del motivo del error, pero es bastante probable. Te explico:

    Un List<T> es un objeto que contiene una colección de objetos del mismo tipo. Puede estar vacío, es decir no contener ningún objeto en su colección. Pero no es lo mismo un List<T> que está vacío que uno que no está creado, o sea que vale null (no existe el objeto). El List<T> es un objeto y como cualquier objeto antes de intentar acceder a él, se debe crear o instanciar el objeto en la memoria y así la referencia de su identificador apuntará al objeto y ya no arrojará más NullReferenceException, que me imagino es lo que te arroja. Entonces, podes instanciar el List en la misma linea que declaras la propiedad (que eso está bien), así (y no necesitas luego crearlo cuando le agregas los objetos Mora):

    public List<Mora>  HistorialMora { getset; } = new List<Mora>();

    Ahora el foreach al toparse con el List iterará 0 veces, porque no contiene elementos, pero no se "quebrará" el programa porque no se topó con una referencia que vale null.

    Saludos

    Pablo

    miércoles, 30 de diciembre de 2020 23:39
  • Hola Rolando,

    ¿Alguna novedad sobre la consulta realizada?

    Gracias por usar los foros de MSDN.

    Eric Ruiz

    ____________________________

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

    Si tiene algún cumplido o reclamo sobre el soporte de MSDN siéntase en la libertad de contactar MSDNFSF@microsoft.com.

    jueves, 31 de diciembre de 2020 14:09
    Moderador
  • Gracias Pablo por la información,

    El motivo del error es que recibo una petición con un objeto JSON, dicho objeto contiene una lista de créditos y dicha lista a su vez contiene   otra sub lista de historial de mora si y solo si el crédito contiene mora,  si no contiene el historial de mora mi aplicación quiebra por que esta haciendo referencia a una propiedad que no existe en ese momento,a continuación la estructura JSON que recibo desde la petición 

    "Lista_credito_historicos": [

            {

                "NumeroCredito""91045",

                "Cuota"300.0000,

                "FechaReporte""2018-01-05T00:00:00",

                "FechaDesembolso""2011-06-26T00:00:00",

                "MontoAutorizado"4500.0000,

                "PlazoMeses"14,

                "FormaDePago""MENSUAL",

                "SaldoDeuda"0.0,

                "EstadoOP""CANCELADO",

                "MontoVencido"0.0,

                

            },

    (Notamos que este registro no contiene la sublista, historial de mora)

            {

                "NumeroCredito""1260936",

                "Cuota"1090.1200,

                "FechaReporte""2019-08-31T00:00:00",

                "FechaDesembolso""2016-06-04T00:00:00",

                "MontoAutorizado"14326.9300,

                "PlazoMeses"48,

                "FormaDePago""MENSUAL",

                "SaldoDeuda"0.0,            

                "MontoVencido"0.0,            

                "HistorialMora": [

                    {

                        "FechaReporte""2018-10-31T00:00:00",

                        "AntiguedadMoraEnDias"127

                    },

                    {

                        "FechaReporte""2018-10-31T00:00:00",

                        "AntiguedadMoraEnDias"127

                    },

                    

                ]

    jueves, 31 de diciembre de 2020 14:16
  • Hola. Así tú aplicación quiebra porque en la lista HistoriaMora no venga informado (es nulo en este caso) deberías corregirlo y controlar que puede darse el caso que venga a null esa lista. También puedes establecer en el acuerdo de interfaz de tu API de backend que debe ser obligatorio enviar datos en esa lista (en ese caso la parte frontend debe modificarse para adecuarse a este requisito) . Con esto, te paso una pequeña modificación en tu bloque foreach
    foreach (var mora in lst_cred.HistorialMora.DefaultIfEmpty())
    
                        {
    
                            contexto.insertar_historial_mora( mora, id_lista_credito);
    
                        }
    Echa un ojo a Enumerable.DefaultIfEmpty Método
    O incluso, este segundo bloque foreach meterlo dentro de un bloque if preguntando si lst_cred.HistorialMora es != null

    if(lst_cred.HistorialMora?.Count > 0) // también puedes hacer lst_credw.HistorialMora != null
    {
    
    foreach (var mora in lst_cred.HistorialMora)
    {
    
                            contexto.insertar_historial_mora( mora, id_lista_credito);
    
     }
    }


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos



    jueves, 31 de diciembre de 2020 15:11
    Moderador
  • Hola Rolando

    Verificaste si era lo que yo te dije el problema? Probaste modificando la linea que te dije?

    Que de hecho, Sergio, en la 2da parte de su respuesta te propone lo mismo que yo, esto es ver si el problema es que pueda ser null el List.

    Saludos

    jueves, 31 de diciembre de 2020 16:15