Skip to Content

Consultas con List

Leer una sección con XxxD.List(client): filtros tipados por campo, orden, y una lectura final que dice cuántas filas espera y qué pasa si hay más.

XxxD.List(client) es la forma de leer las filas de una sección desde .NET. Encadenas un filtro por campo, con su tipo, y terminas con una lectura que dice cuántas filas esperas.

using static DemoUp.MyDinaup.SectionsD;

// Un listado: los 50 expedientes más recientes de un cliente.
var expedientes = await ExpedientesD.List(client)
    .ReferenciaClienteIDIs(clienteId)
    .OrderByDescending(ExpedientesD.ExpedientesES.FechaDato_UTC)
    .ReadUpToAsync(50);

// Un cálculo: todos los impuestos. Si hay más de 200, lanza.
var impuestos = await ImpuestosD.List(client).ReadAllAsync(maxRows: 200);

Los nombres salen de tu esquema: ExpedientesD y ReferenciaClienteIDIs son un ejemplo. Los tuyos están en tu paquete MyDinaup.

Antes de empezar

  • Un DinaupClientC conectado: Cliente Dinaup.
  • Tu paquete {Empresa}.MyDinaup generado con una versión reciente: trae List en cada sección.

Cómo termina una consulta

Toda consulta acaba en una de estas lecturas. El nombre dice qué pasa si hay más filas de las que pides.

LecturaPara quéSi hay más filas
ReadUpToAsync(n)Una pantalla o un listado, donde una fila de menos no rompe nada.Corta en n, sin error.
ReadAllAsync(maxRows: n)Un cálculo o un cruce que necesita todas: impuestos, tarifas.Lanza ReadCeilingException.
CountAsync(maxRows: n)Contar las filas que cumplen.Lanza ReadCeilingException.
FirstOrDefaultAsync()La primera fila que cumple, o null.
GetByIdAsync(id)La fila con ese id si cumple los filtros, o null. Un id vacío da null sin llamar al servidor.
AnyAsync()Saber si alguna fila cumple. Solo pide el id.
ReadAllLiveAsync(redis, n)Tener las filas en memoria y al día. Ver Caché en vivo.Lanza ReadCeilingException.
  • ReadAllAsync() y CountAsync() sin número cuentan hasta 10.000. Ninguna lectura pide más de 1.000.000.
  • Desde el 80 % de maxRows, la lectura deja un aviso en el log con el método que lee. Sube el número o estrecha el filtro antes de que lance.
  • Si ReadAllAsync lanza por el tope, no la cambies por ReadUpToAsync: faltaría una fila sin que nadie lo vea.
  • El servidor devuelve 2.000 filas por petición. La lectura pide las páginas que necesita.

Filtros

Cada campo de la sección tiene sus filtros, con el nombre del campo delante. Todos los filtros de una consulta se cumplen a la vez.

Tipo del campoFiltros
TextoIs, IsNot, Contains, StartsWith, EndsWith, NotContains, NotStartsWith, NotEndsWith. Sin distinguir mayúsculas ni acentos.
NúmeroIs, IsNot, AtLeast, AtMost, GreaterThan, LessThan, Between.
Fecha y horaFrom, Until, After, Before, Between. From y Until incluyen el valor; After y Before, no.
Sí o noIsTrue, IsFalse.
EnumIs, IsNot, In, NotIn.
Relación a otra secciónIDIs, IDIsNot, IDIn, IDNotIn, IsEmpty, IsNotEmpty.
CualquieraIsEmpty, IsNotEmpty.
El id de la filaIDIn, IDNotIn.
var pendientes = await VentasD.List(client)
    .ReferenciaClienteIDIs(clienteId)
    .FechaFrom(new DateTime(2026, 1, 1))
    .TotalAtLeast(100m)
    .ReadUpToAsync(100);

Reglas que lanzan antes de llamar al servidor:

  • Un id vacío en IDIs o un texto vacío en Is. Para «sin valor», usa IsEmpty.
  • Dos Is sobre el mismo campo. Para «uno u otro», usa In.
  • Between con el mínimo mayor que el máximo.

Uno u otro grupo

Or() empieza otro grupo de filtros. Una fila entra si cumple los filtros de antes de Or() o los de después.

var avisos = await TareasD.List(client)
    .EstadoIs(EstadoTareaE.Bloqueada)
    .Or()
    .FechaLimiteBefore(DateTime.UtcNow)
    .ReadUpToAsync(200);

Buscar y filtrar a mano

  • Search("texto") busca como el buscador de Dinaup y se suma a los demás filtros.
  • Where(new FilterCondition(campo, operador, valor)) cubre una condición que los filtros generados no tienen. Prefiere los generados: comprueban el tipo.

Orden, páginas y campos

MétodoQué hace
OrderBy(campo), OrderByDescending(campo)Ordena por un campo, con su constante XxxES. Un orden por consulta.
Skip(n)Salta las primeras filas. La página 3 de 10 es OrderBy(…).Skip(20).ReadUpToAsync(10).
Fields(campo1, campo2…)Trae solo esos campos y el id. Los demás quedan con su valor vacío; fila.IsPresent(campo) dice cuáles llegaron.

Sin orden, las filas llegan por fecha de alta, de la más antigua a la más nueva. «Las 10 últimas» es OrderByDescending(…).ReadUpToAsync(10).

Eliminados y archivados

  • List(client) deja fuera los registros eliminados. ListIncludingDeleted(client) los trae.
  • Los archivados quedan fuera, como en los informes. IncludingArchived() los trae, en las secciones que tienen campo de archivado.
  • GetByIdAsync y un filtro por el campo de archivado encuentran un archivado sin pedir nada más.

Cuando falla

ExcepciónQué pasóQué haces
Exceptions.ReadFailedExceptionDinaup no contestó la lectura.Enseña el estado de error de la pantalla. Nunca una lista vacía: «no hay» y «no se ha podido leer» no son lo mismo.
Exceptions.ReadCeilingExceptionHay más filas que maxRows.Estrecha el filtro o sube el número.
ArgumentException, InvalidOperationExceptionLa consulta está mal escrita: un valor vacío, dos órdenes, un Or() sin filtros.Corrige el código.

List o un informe

NecesitasUsa
Filas de una sección con sus campos, filtradas en el códigoList
Columnas calculadas o el criterio que la empresa ya definióUn informe: Cliente Dinaup
Todas las filas de un informeLoadAllRowsAsync
Sumar o agrupar en el servidorIAQuery
Las filas en memoria, siempre al díaCaché en vivo

GetRowsAsync con RowsRequestParameters sigue funcionando, pero no dice cuántas filas espera y corta sin avisar. En código nuevo, usa List.

En esta página