2015-10-24 32 views
3

生成視圖中顯示的數據我使用ASP.NET MVC,EF 6和SQL Server 2008asp.net的MVC,原始SQL:使用聚合函數

我要生成一個視圖這將顯示所有的總和某一年特定月份每天的銷售額。

我發現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) 

結果

Image showing all the sales in 2014 and result of the query above

那麼目前我沒有太多的數據。但它看起來像我從查詢中得到了我想要的。

我爲此寫了一個控制器,現在我不知道如何在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

你想如何顯示它?一個月份和年份的標題和一張表格?表格應該是什麼樣子(日期和總計的列,或每天的列)? –

+0

我想顯示爲列:|日期| TotalSales | 。如果日期列包含當月升序的所有日期和相應的總銷售額並且如果在特定日期沒有銷售時顯示0,則會更好。 –

+0

如果你只想要有數量的日子(即模仿你的sql查詢),一個linq查詢來獲取它的總天數和總和是相對簡單的。我會考慮如何在月內的所有日子裏生成它 –

回答

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

您將SQL查詢可以在LINQ中產生並投射到您的視圖模型視圖中顯示什麼

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

輝煌!謝謝史蒂芬一如既往.. :) –