需要帮助使用LINQ查询和ASP.NET MVC吗?

3

我的代码库返回一个账户列表。

每个账户都有日期和花费金额。所以,我有一个账户列表,在我的控制器中,我想稍微处理一下这个列表。

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

以下是我尝试过的代码:

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

    }

这个计算月度总数的方法是否正确?

我一直在使用针对每个视图的ViewModel的强类型视图,那么我应该将monthlyTotals设置为什么类型,以便将其添加为ViewModel的字段并传递给View?

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)
}                         

我应该将这个类添加到我的ViewModels目录中吗? - AlexanderTheGreat
这就是我所做的。如果你认为它太小而不足以成为自己的文件,你可以将其放在其他相关类中的一个中。 - Robert Harvey

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)
          };

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


1
我可能会将这个逻辑分解成一个服务层类来持有业务逻辑。此外,如果视图期望的结构与模型不同,您可以在服务方法中转换结果并返回自定义模型类型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接