我正在使用ASP.NET MVC,EF 6和SQL Server 2008.
我想生成一个视图,该视图会显示特定年份特定月份每天所有销售额的总和。
我发现LINQ查询在这种类型的工作中非常复杂,所以我使用了原始的SQL查询。我在SQL服务器上编写了查询并进行了测试,结果很好。
select
YEAR(Date) as Year,
MONTH(Date) as month,
DAY(Date) as date,
SUM(GrandTotal) as Total
from
Sales
where
Year(Date) = 2014
and MONTH(Date) = 12
group by
DAY(Date), YEAR(Date), MONTH(date)
结果
目前我没有太多数据。但看起来我从查询中得到了我想要的东西。
我为此目的编写了一个控制器,现在我不知道如何在View中显示这些数据。
public ActionResult MonthlySalesByDate()
{
DateTime today = DateTime.Now.Date;
int _year = today.Year;
int _month = today.Month;
//raw sql query
string query = "select SUM(GrandTotal) as Total, DAY(Date) as date, MONTH(Date) as month, YEAR(Date) as Year from Sales where Year(Date) = " + _year + " and MONTH(Date) =" + _month + " Group by DAY(Date), YEAR(Date), MONTH(date)";
//executing raw sql query
var _model = db.Stocks.SqlQuery(query).ToList();
return View(_model);
}
请帮我解决这个问题。如果有更好的方法,或者我犯了错误,请告诉我。
答案 0 :(得分:2)
首先创建视图模型以表示您要在视图中显示的内容
public class DayTotalVM
{
public int Day { get; set; }
[DisplayFormat(DataFormatString = "{0:C}")]
public decimal Total { get; set; }
}
public class SalesVM
{
[DisplayFormat(DataFormatString = "{0:MMMM yyyy}")]
public DateTime Date { get; set; }
public List<DayTotalVM> Days { get; set; }
}
您可以在linq中生成sql查询,并使用
投影到视图模型中int year = 2014;
int month = 12;
var query = db.Sales.Where(x => x.Date.Year == year && x.Date.Month == month)
.GroupBy(x => x.Date).Select(g => new DayTotalVM
{
Day = g.Key.Day,
Total = g.Sum(x => x.Total)
})
但是,这只会根据您上面的图片为您提供2个项目,但是根据您要显示的月份所有日期的评论,您可以添加
int daysInMonth = DateTime.DaysInMonth(year, month);
List<DayTotalVM> days = new List<DayTotalVM>();
for(int i = 1; i < daysInMonth + 1; i++)
{
DayTotalVM item = new DayTotalVM () { Day = i };
DayTotalVM ex = query.Where(x => x.Day == i).FirstOrDefault();
if (ex != null)
{
item.Total = ex.Total;
}
days.Add(item);
}
最后初始化并返回您的视图模型
SalesVM model = new SalesVM();
{
Date = new DateTime(year, month, 1),
Days = days
}
return View(model);
然后视图将是
@model SalesVM
@Html.DisplayFor(m => m.Date);
<table>
@for(int i = 0; i < Model.Days.Count; i++)
{
<tr>
<td>@Html.DisplayFor(m => m.Days[i].Day)</td>
<td>@Html.DisplayFor(m => m.Days[i].Total)</td>
</tr>
}
</table>
修改强>
可以使用for
GroupJoin()
循环
public ActionResult MonthlySalesByDate(int year, int month)
{
int daysInMonth = DateTime.DaysInMonth(year, month);
var days = Enumerable.Range(1, daysInMonth);
var query = db.Sales.Where(x => x.Date.Year == year && x.Date.Month == month).Select(g => new
{
Day = g.Date.Day,
Total = g.Total
});
var model = new SalesVM
{
Date = new DateTime(year, month, 1),
Days = days.GroupJoin(query, d => d, q => q.Day, (d, q) => new DayTotalVM
{
Day = d,
Total = q.Sum(x => x.Total)
}).ToList()
};
return View(model);
}