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
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 variablepredicate
se inicializa con un predicado vacío y luego se expande dinámicamente aplicando condiciones adicionales mediante el métodoAnd
de la clasePredicateBuilder
.En este caso, el predicado verifica si la propiedad
BillAcct
de cada objetoSaddadVM
coincide con el parámetroSearchItem
, si se proporciona. Además, también excluye cualquier objeto con un valorId
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
yDocumenter
) y proyecta los resultados en un nuevo objetoSaddadVM
. El métodoWhere
se aplica al resultado de la unión y la variablepredicate
para filtrar los resultados según los criterios especificados. Por último, los métodosSkip
yTake
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ámetrosPage
yTake
y observando los resultados. Por último, puedes utilizar un depurador o sentencias de registro para inspeccionar los valores intermedios de las variablespredicate
ybill
y asegurarte de que coinciden con tus expectativas.