3

我的存储库返回一个帐户列表。

每个帐户都有一个日期和一个 MoneySpent 十进制金额。所以,我有我的帐户列表,在我的控制器中,我正在尝试处理这个列表。

我想要一个对象,其中包含我的帐户列表中所有月份的字符串名称以及该月花费的所有资金的总和。

这是我尝试过的:

    [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();

    }

这似乎是计算每月总计的正确方法吗?

此外,我一直在为每个视图使用带有 ViewModels 的强类型视图,那么我应该制作什么类型的每月总计,以便我可以将其添加为我的 ViewModel 上的一个字段并将其传递给我的视图?

4

3 回答 3

3

在我看来是对的。

当我需要将这样的数据传递给我的视图时,我会为它创建一个类。所以你的班级看起来像这样:

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

你的 SELECT 子句看起来像这样:

select new MonthlyTotal                          
{                                
    Month = m.Key,                               
    MonthSum= m.Sum(a => a.AmountAssigned)
}                         
于 2009-06-23T21:20:29.947 回答
1

我可能会将该逻辑分解为包含业务逻辑的服务层类。除此之外,如果视图期望的结构与模型不同,您将在返回自定义模型类型的服务方法中转换结果。

于 2009-06-23T21:19:18.017 回答
1

使用匿名类型是行不通的,因为视图代码不知道它有什么属性。我建议在 Models 目录中创建一个仅查看模型。

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

然后在 select 语句中创建一个新的模型值:

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

然后,您可以将此模型用作视图的类型。

于 2009-06-23T21:23:07.697 回答