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 variaciones de la misma pregunta. ¿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. Cada método devuelve 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 ocupa seis líneas:
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.
QuickQuery en play
QuickQuery viene de play, la propia aplicación de Dinaup, y pasó al SDK después de funcionar en producción. En play, el panel Ponerse al día lo usa para contar facturas sin asiento contable. También lo usa para detectar empleados con contrato vigente y sin nómina del mes, y para agrupar por cuenta los movimientos bancarios sin clasificar. 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. Desde el SDK, QuickQuery está disponible para 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 está 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 30.000 filas por página.
La regla práctica: empieza por QuickQuery. Si necesitas más, el constructor completo sigue a un método de distancia, como contamos en el post de IAQuery.
