es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Ejecutando y devolviendo dos consultas al mismo tiempo.

Quiero mostrar los datos de la siguiente manera: imagen

Estaba extrayendo los detalles de las tablas de postgres con el controlador home de esta forma:

    public IActionResult AllTransactionsList(DateTime startDate, DateTime endDate)
{
    var dataset = new DataSet();
    using var connection = new NpgsqlConnection(connString);
    connection.Open();
    Console.WriteLine(startDate);
    var query = String.Format(@"SELECT accounts.account,accounts.type,DATE(transactions.date),transactions.transactionid,transactions.amount,transactions.note FROM transactions FULL JOIN accounts ON transactions.accountid=accounts.accountid WHERE transactions.date BETWEEN '{0}' AND '{1}' ORDER BY transactions.date;", startDate, endDate);


    string mainQuery = String.Format(@"SELECT sum(amount) FROM transactions INNER JOIN accounts ON transactions.accountid=accounts.accountid WHERE accounts.type='income' AND transactions.date BETWEEN '{0}' AND '{1}'", startDate,endDate);
    using var mainCommand = new NpgsqlCommand(query, connection);
    decimal mainResult = mainCommand.ExecuteNonQuery();

    using (var command = new NpgsqlCommand(query, connection))
    {

        var adapter = new NpgsqlDataAdapter(command);
        adapter.Fill(dataset);
    }

    return View(dataset);

}

pero también necesito mostrar los ingresos/gastos que están en la parte de abajo imagen

¿Cómo puedo obtener datos de dos consultas al mismo tiempo y ponerlos en un conjunto de datos?

Es decir, tengo dos consultas (query, mainResult). Obtendré filas de query y obtendré un valor decimal de main result. Necesito devolver ambos en la vista.

¿Cómo puedo lograr esto? ¿Alguien puede ayudarme, por favor?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para lograr mostrar datos de dos consultas al mismo tiempo, puedes crear una clase de modelo que contenga tanto los datos consultados como el resultado principal. Por ejemplo:

    public class TransactionsViewModel
    {
        public DataSet TransactionsData { get; set; }
        public decimal MainResult { get; set; }
    }
    

    En tu acción del controlador, consulta tanto los datos de transacciones como el resultado principal por separado, y luego asígnalos a una instancia de TransactionsViewModel, de la siguiente manera:

    public IActionResult AllTransactionsList(DateTime startDate, DateTime endDate)
    {
        var viewModel = new TransactionsViewModel();
    
        using var connection = new NpgsqlConnection(connString);
        connection.Open();
        Console.WriteLine(startDate);
    
        var transactionQuery = String.Format(@"SELECT accounts.account,accounts.type,DATE(transactions.date),transactions.transactionid,transactions.amount,transactions.note FROM transactions FULL JOIN accounts ON transactions.accountid=accounts.accountid WHERE transactions.date BETWEEN '{0}' AND '{1}' ORDER BY transactions.date;", startDate, endDate);
    
        var mainQuery = String.Format(@"SELECT sum(amount) FROM transactions INNER JOIN accounts ON transactions.accountid=accounts.accountid WHERE accounts.type='income' AND transactions.date BETWEEN '{0}' AND '{1}'", startDate, endDate);
    
        using (var transactionCommand = new NpgsqlCommand(transactionQuery, connection))
        using (var mainCommand = new NpgsqlCommand(mainQuery, connection))
        {
            var adapter = new NpgsqlDataAdapter(transactionCommand);
            viewModel.TransactionsData = new DataSet();
            adapter.Fill(viewModel.TransactionsData);
    
            decimal mainResult = (decimal)mainCommand.ExecuteScalar();
            viewModel.MainResult = mainResult;
        }
    
        return View(viewModel);
    }
    

    En tu vista, puedes acceder tanto a los datos de transacciones como al resultado principal de la siguiente manera:

    @model TransactionsViewModel
    
    <!-- Mostrar datos de transacciones -->
    <table>
        <thead>
            ...
        </thead>
        <tbody>
            @foreach (DataRow row in Model.TransactionsData.Tables[0].Rows)
            {
                ...
            }
        </tbody>
    </table>
    
    <!-- Mostrar resultado principal -->
    <div>Ingresos totales para el período seleccionado: @Model.MainResult</div>
    

Comments are closed.