es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

devolverá nulo cuando debería devolver una lista de valores en C#

Buen día a todos,

Tengo un problema al usar ‘predicate’.
Estoy intentando hacer una función que devuelva los resultados de una búsqueda de texto.
Aquí está el cuerpo de la función:

public List<saddadvm> GetAllBills(int Page = 1, int Take = 10, int? SearchField = null, string SearchItem = null)
{
     var predicate = PredicateBuilder.New<saddadvm>();
     if (!string.IsNullOrWhiteSpace(SearchItem))
     {         
           predicate = predicate.And(x => x.BillAcct == SearchItem);
     }
     predicate = predicate.And(x => x.Id != 0);
     var bill = (from d in _context.Saddad
                    join R in _context.Requests on d.ReqId equals R.Id
                    join l in _context.Documenter on R.DocumenterId equals l.Id
                    where d.RecordStatus != GeneralEnums.RecordStatus.Deleted
                    select new SaddadVM
                    {
                        BillAcct = d.BillAcct,
                        ReqID = d.ReqId,
                        DocName = l.FullName,
                        DueDt = d.DueDt,
                        BillAmount = d.BillAmount

                    }).Where(predicate).Skip((Page - 1) * Take).Take(Take).ToList();

    return bill;
}

Sabiendo que el objeto “Bill” debería devolver al menos 2 resultados dependiendo de la ejecución de la misma consulta en la base de datos, como se muestra en la siguiente imagen:
enlace de la imagen

Tags:  ,

Answer

  1. Avatar for davy.ai

    El código proporcionado utiliza la clase PredicateBuilder para componer dinámicamente un predicado para filtrar los resultados según un criterio de búsqueda dado. La variable predicate se inicializa con un predicado vacío y luego se expande dinámicamente aplicando condiciones adicionales mediante el método And de la clase PredicateBuilder.

    En este caso, el predicado verifica si la propiedad BillAcct de cada objeto SaddadVM coincide con el parámetro SearchItem, si se proporciona. Además, también excluye cualquier objeto con un valor Id de cero, que es una forma común de excluir objetos no inicializados o no válidos.

    La consulta en sí utiliza LINQ para unir tres tablas (Saddad, Requests y Documenter) y proyecta los resultados en un nuevo objeto SaddadVM. El método Where se aplica al resultado de la unión y la variable predicate para filtrar los resultados según los criterios especificados. Por último, los métodos Skip y Take se utilizan para implementar la paginación, omitiendo cierta cantidad de elementos y tomando cierta cantidad de elementos, respectivamente.

    Para solucionar el problema de no devolver el número esperado de objetos, puedes intentar ejecutar la misma consulta directamente en la base de datos y comparar los resultados con los devueltos por la función. Además, puedes intentar modificar el predicado para eliminar la condición de la propiedad BillAcct y ver si devuelve todos los objetos en lugar de solo un subconjunto. También puedes verificar si la lógica de paginación funciona como se espera ajustando los parámetros Page y Take y observando los resultados. Por último, puedes utilizar un depurador o sentencias de registro para inspeccionar los valores intermedios de las variables predicate y bill y asegurarte de que coinciden con tus expectativas.

Comments are closed.