Pregunta

Mi repositorio devuelve una lista de Cuentas.

Cada cuenta tiene una fecha y un monto decimal de MoneySpent. Entonces, tengo mi lista de Cuentas y en mi controlador estoy tratando de procesar un poco esta lista.

Deseo tener un objeto que contenga el nombre de la cadena de todos los meses en mi lista de Cuentas y una Suma de todo el dinero gastado para ese mes.

Esto es lo que he intentado:

    [AcceptVerbs(HttpVerbs.Get)]
    public ActionResult Detail(int id)
    {
        var recentAccounts = accountRepository.GetAccountsSince(DateTime.Now.AddMonths(-6));

        var monthlyTotals = from a in recentAccounts
                           group a by a.DateAssigned.Month.ToString("MMM") into m
                           select new 
                           { 
                               Month = m.Key,
                               MonthSum = m.Sum(a => a.MoneySpent)
                           };


        return View();

    }

¿Parece esta la forma correcta de calcular Totales mensuales?

Además, he estado usando vistas fuertemente tipadas con ViewModels para cada vista, entonces, ¿qué tipo debería hacer TotalTotals mensuales para poder agregarlo como un campo en mi ViewModel y pasarlo a mi Vista?

¿Fue útil?

Solución

Me parece correcto.

Cuando necesito pasar datos como este a mi vista, creo una clase para ello. Entonces su clase se vería así:

public class MonthlyTotal
{
    public string Month { get; set; }
    public decimal MonthSum { get; set; }
}

y su cláusula SELECT se vería así:

select new MonthlyTotal                          
{                                
    Month = m.Key,                               
    MonthSum= m.Sum(a => a.AmountAssigned)
}                         

Otros consejos

Probablemente dividiría esa lógica en una clase de capa de servicio con lógica empresarial. Junto con eso, si la vista espera una estructura diferente al modelo, transformaría sus resultados en su método de servicio devolviendo un tipo de modelo personalizado.

El uso de un tipo anónimo no funcionará ya que el código de vista no sabrá qué propiedades tiene. Sugiero crear un modelo de solo lectura en el directorio Modelos.

public class MonthlySumModel
{
     public string Month { get; set; }
     public decimal Sum { get; set; }
}

Luego cree un nuevo valor de modelo en la instrucción select:

select new MonthlySumModel
          {
              Month = m.Key,
              Sum = m.Sum(a => a.MoneySpent)
          };

Luego puede usar este modelo como tipo para la vista.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top