我的存储库返回一个帐户列表。
每个帐户都有一个日期和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();
}
这似乎是计算monthlyTotals的正确方法吗?
此外,我一直在为每个视图使用带有ViewModel的强类型视图,那么我应该将monthTotals设置为什么类型,以便我可以将其添加为ViewModel上的字段并将其传递给我的View?
答案 0 :(得分: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)
}
答案 1 :(得分:1)
我可能会将该逻辑分解为包含业务逻辑的服务层类。除此之外,如果视图期望结构与模型不同,您将在服务方法中转换结果,返回自定义模型类型。
答案 2 :(得分: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)
};
然后,您可以将此模型用作视图的类型。