QuickQuery: cuánto, cuántos y cuáles en una línea de C#
QuickQuery, el atajo del SDK .NET de Dinaup sobre IAQuery: contar, sumar, agrupar y consultar secciones en una llamada, con filtros legibles y valores convertidos.
La mayoría de las consultas de una aplicación de negocio son la misma pregunta con distinta ropa. ¿Cuánto he facturado este mes? ¿Cuántos empleados siguen sin nómina? ¿Cuáles son mis diez mejores clientes? Con IAQuery ya podías responderlas sin crear un informe, pero montando la petición campo a campo.
QuickQuery es el atajo que faltaba: los mismos agregados en el servidor, expuestos como métodos del cliente que devuelven el valor ya convertido a su tipo.
De seis líneas a una
Sumar la facturación del año con el constructor de IAQuery son seis líneas honestas:
var req = new IAQueryRequestParameters(VentasIngresosD._SectionID, 1);
req.AddField(VentasIngresosD.VentasIngresosES.ImporteTotal, "sum", "total");
req.AddWhere(VentasIngresosD.VentasIngresosES.FechaOperacion, ">=", "2026-01-01");
var res = await dinaupClient.IAQuery_GetAsync(req);
var total = decimal.Parse(res.Data[0]["total"], CultureInfo.InvariantCulture);Con QuickQuery, la misma consulta cabe en una llamada:
var total = await dinaupClient.QuickQuery.SumAsync(
VentasIngresosD._SectionID,
VentasIngresosD.VentasIngresosES.ImporteTotal,
[QuickQueryFilter.GreaterThanOrEqual(VentasIngresosD.VentasIngresosES.FechaOperacion, "2026-01-01")]);No cambia nada por debajo: la suma corre en la base de datos y viaja una fila, no un año de facturas. Cambia lo que escribes y lo que lees: SumAsync devuelve un decimal, sin diccionarios ni conversión a mano.
Seis métodos, seis preguntas
| Pregunta | Método | Devuelve |
|---|---|---|
| ¿Cuántas filas cumplen? | CountAsync | int |
| ¿Cuánto suma un campo? | SumAsync | decimal |
| ¿Qué valores tiene una columna? | ValuesAsync | List<string> |
| ¿Cuál es la primera fila? | FirstAsync | la fila, o null |
| Dame las filas | QueryAsync | QuickQueryResult |
| Totales por grupo | GroupByAsync | QuickQueryResult |
Los dos últimos devuelven un resultado con Ok, Rows, Columns y el tiempo de servidor, pensado para recorrerlo en dos líneas. Los diez mejores clientes del año:
var top = await dinaupClient.QuickQuery.GroupByAsync(
VentasIngresosD._SectionID,
VentasIngresosD.VentasIngresosES.ReferenciaCliente,
[QuickQueryAggField.Sum(VentasIngresosD.VentasIngresosES.ImporteTotal)],
orderBy: VentasIngresosD.VentasIngresosES.ImporteTotal + " desc",
limit: 10);Filtros que se leen como frases
Un filtro de QuickQuery se escribe con un constructor estático por operador: Equal, NotEqual, GreaterThan, GreaterThanOrEqual, LessThan, LessThanOrEqual, Like, In. La condición "facturas de julio" se lee tal cual:
QuickQueryFilter[] julio =
[
QuickQueryFilter.GreaterThanOrEqual(VentasIngresosD.VentasIngresosES.FechaOperacion, "2026-07-01"),
QuickQueryFilter.LessThanOrEqual(VentasIngresosD.VentasIngresosES.FechaOperacion, "2026-07-31")
];Los filtros se combinan con and, y .Or() cambia el conector del que lo lleva. Los campos admiten las constantes tipadas de tu MyDinaup, como en todo el SDK: si mañana renombras un campo en Flex, el compilador te avisa.
Probado en casa
QuickQuery no nació en un documento de diseño. Nació en play, nuestra propia aplicación, donde el panel Ponerse al día lo usa para contar facturas sin asiento contable, detectar empleados con contrato vigente y sin nómina del mes, y agrupar los movimientos bancarios sin clasificar por cuenta. La Liquidación de IVA suma sus casillas con él sobre cientos de miles de facturas.
Todas esas pantallas comparten el mismo patrón: muchas preguntas pequeñas, agregadas en el servidor, cada una en una línea. Cuando el atajo demostró que aguantaba producción, lo movimos al SDK para que lo tenga cualquier aplicación conectada a Dinaup.
Dónde acaba el atajo
QuickQuery cubre el caso frecuente y ahí se queda. Sus límites, claros:
- Agrupa por el valor directo de un campo. Para agrupar por mes o trimestre (funciones de fecha como
monthyear) usa el constructor de IAQuery. - No hay
HAVING, nicount distinct, ni alias propios por columna: eso vive enIAQueryRequestParameters. CountAsyncySumAsyncdevuelven0tanto si el resultado es cero como si la consulta falló. Si necesitas distinguirlo,QueryAsyncte daOkyError.- Hereda todo lo demás de IAQuery: los permisos del usuario de la sesión, el filtro de eliminados y el tope de 10.000 filas por página.
La regla práctica: empieza por QuickQuery; si la pregunta pide más, el constructor completo sigue a un método de distancia, como contamos en el post de IAQuery.