Transmitir datos de la base de datos al navegador como JSON a través de ASP.NET Core

asp.net-core c# dapper

Pregunta

Tengo una API que necesita devolver grandes listas de datos JSON. Intento transmitirlo directamente de la base de datos al cliente, para evitar acaparar la RAM en mi servidor web. ¿Esta sería una buena manera de hacerlo? (Parece estar funcionando)

[HttpGet]
[Route("data")]
public IEnumerable<MappedDataDto> GetTestData()
{
    var connection = new NpgsqlConnection(_connectionString);
    connection.Open();

    IEnumerable<RawDataDto> rawItems = connection.Query<RawDataDto>("SELECT * FROM sometable", buffered: true);

    foreach (var rawItem in rawItems)
    {
        var mappedItem = Map(rawItem);
        yield return mappedItem;
    }
}
  • ¿Debo instalar la conexión o me ocuparé de eso automáticamente? Puedo envolverlo using bloque, ya que arroja una excepción como "no puedo acceder a un objeto eliminado"
  • ¿Sería mejor usar algún tipo de flujo en lugar de yield return de yield return ?

EDITAR: En mi caso, tenemos una gran aplicación web javascript que muestra gráficos y tablas de datos entre dos fechas. El cliente descarga todo el conjunto de datos y lo hace en cálculos de memoria en el cliente para representar esos datos de diferentes maneras (los usuarios pueden crear sus propios tableros personalizados, de modo que no todos usan los datos de la misma manera).

Nuestro problema es que cuando los clientes solicitan un período con una gran cantidad de datos, el consumo de memoria de nuestra ASP.NET Core API aumenta mucho. Entonces esto es lo que estamos tratando de prevenir.

Desafortunadamente, realizar cambios más grandes en el cliente llevaría mucho tiempo, por lo que estamos viendo lo que podemos hacer en el lado de la API.

Es por eso que estoy tratando de averiguar si hay una forma de transmitir los datos desde la base de datos a través de la API. De modo que no habrá cambios en el cliente, y el consumo de memoria de la API no será tan malo, ya que no tendrá que contener todo en la memoria.

Respuesta popular

Dada la funcionalidad ( visualización de datos en cuadros / gráficos ), sugeriría algunos cambios tanto al cliente como a la aplicación del servidor.

Supongamos este escenario de caso:

Un cliente solicita datos por un período de 30 días, lo que corresponde a 1 millón de filas

Esto significa que habrá un gran consumo de memoria no solo en el servidor sino también en la aplicación cliente. Así que sugeriría reescribir la consulta para agrupar los datos por día, por hora o incluso por un período de tiempo más corto , según lo que necesite, esto reduciría la cantidad de datos que se envían desde el servidor:

  • agrupación por día: 30 registros
  • agrupamiento por hora: 720 registros
  • agrupación por rango de 10 minutos: 4320 registros
  • agrupamiento por minuto: 43200 registros

La aplicación del cliente obviamente necesitaría algunos cambios para hacer los cálculos basados ​​en los datos agrupados, no en cada fila individual.

Por cierto, no sé qué RBDMS está utilizando, pero esto podría ser útil (SQL Server): cómo agrupar el tiempo por hora o por 10 minutos



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué