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
DinaupClientCconectado: Cliente Dinaup. - Tu paquete
{Empresa}.MyDinaupgenerado con una versión reciente: traeListen 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.
| Lectura | Para 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()yCountAsync()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
ReadAllAsynclanza por el tope, no la cambies porReadUpToAsync: 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 campo | Filtros |
|---|---|
| Texto | Is, IsNot, Contains, StartsWith, EndsWith, NotContains, NotStartsWith, NotEndsWith. Sin distinguir mayúsculas ni acentos. |
| Número | Is, IsNot, AtLeast, AtMost, GreaterThan, LessThan, Between. |
| Fecha y hora | From, Until, After, Before, Between. From y Until incluyen el valor; After y Before, no. |
| Sí o no | IsTrue, IsFalse. |
| Enum | Is, IsNot, In, NotIn. |
| Relación a otra sección | IDIs, IDIsNot, IDIn, IDNotIn, IsEmpty, IsNotEmpty. |
| Cualquiera | IsEmpty, IsNotEmpty. |
| El id de la fila | IDIn, 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
IDIso un texto vacío enIs. Para «sin valor», usaIsEmpty. - Dos
Issobre el mismo campo. Para «uno u otro», usaIn. Betweencon 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étodo | Qué 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. GetByIdAsyncy un filtro por el campo de archivado encuentran un archivado sin pedir nada más.
Cuando falla
| Excepción | Qué pasó | Qué haces |
|---|---|---|
Exceptions.ReadFailedException | Dinaup 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.ReadCeilingException | Hay más filas que maxRows. | Estrecha el filtro o sube el número. |
ArgumentException, InvalidOperationException | La consulta está mal escrita: un valor vacío, dos órdenes, un Or() sin filtros. | Corrige el código. |
List o un informe
| Necesitas | Usa |
|---|---|
| Filas de una sección con sus campos, filtradas en el código | List |
| Columnas calculadas o el criterio que la empresa ya definió | Un informe: Cliente Dinaup |
| Todas las filas de un informe | LoadAllRowsAsync |
| Sumar o agrupar en el servidor | IAQuery |
| Las filas en memoria, siempre al día | Caché en vivo |
GetRowsAsync con RowsRequestParameters sigue funcionando, pero no dice cuántas filas espera y corta sin avisar. En código nuevo, usa List.