Dinaup 2027 ya está llegando: agentes de IA, stock por almacén y todo más rápido. Descubre las novedades →
DinaupBlog
← Volver al blog

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.

Equipo Dinaup9 de julio de 20263 min de lectura

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

PreguntaMétodoDevuelve
¿Cuántas filas cumplen?CountAsyncint
¿Cuánto suma un campo?SumAsyncdecimal
¿Qué valores tiene una columna?ValuesAsyncList<string>
¿Cuál es la primera fila?FirstAsyncla fila, o null
Dame las filasQueryAsyncQuickQueryResult
Totales por grupoGroupByAsyncQuickQueryResult

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, ni count distinct, ni alias propios por columna: eso vive en IAQueryRequestParameters.
  • CountAsync y SumAsync devuelven 0 tanto si el resultado es cero como si la consulta falló. Si necesitas distinguirlo, QueryAsync te da Ok y Error.
  • 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.

Siguiente paso

Sigue leyendo