我目前有以下代碼可在過去30天內生成銷售報告。我想知道是否可以使用linq來一步生成這個報告,而不是我在這裏的基本循環。使用Linq to SQL生成銷售報告
對於我的要求,每天都需要給我返回一個值,所以如果在任何一天沒有銷售,那麼返回0。
任何Sum linq示例在那裏都沒有解釋如何包含where過濾器,所以我很困惑如何獲得每天的總金額或0,如果沒有銷售,最後我經歷的日子。
感謝您的幫助, 豐富
//setup date ranges to use
DateTime startDate = DateTime.Now.AddDays(-29);
DateTime endDate = DateTime.Now.AddDays(1);
TimeSpan startTS = new TimeSpan(0, 0, 0);
TimeSpan endTS = new TimeSpan(23, 59, 59);
using (var dc = new DataContext())
{
//get database sales from 29 days ago at midnight to the end of today
var salesForDay = dc.Orders.Where(b => b.OrderDateTime > Convert.ToDateTime(startDate.Date + startTS) && b.OrderDateTime <= Convert.ToDateTime(endDate.Date + endTS));
//loop through each day and sum up the total orders, if none then set to 0
while (startDate != endDate)
{
decimal totalSales = 0m;
DateTime startDay = startDate.Date + startTS;
DateTime endDay = startDate.Date + endTS;
foreach (var sale in salesForDay.Where(b => b.OrderDateTime > startDay && b.OrderDateTime <= endDay))
{
totalSales += (decimal)sale.OrderPrice;
}
Response.Write("From Date: " + startDay + " - To Date: " + endDay + ". Sales: " + String.Format("{0:0.00}", totalSales) + "<br>");
//move to next day
startDate = startDate.AddDays(1);
}
}
編輯: 約翰的回答是處理我的查詢的好方法。以下是對代碼進行調整以使其適用於此示例,以防其他人遇到此問題。這將從allDays表執行外連接,並在當天沒有銷售時返回0值。
var query = from d in allDays
join s in salesByDay on d equals s.Day into j
from s in j.DefaultIfEmpty()
select new { Day = d, totalSales = (s != null) ? s.totalSales : 0m };
我與解決方案上來過,但請求似乎包括爲其返回任何行天。在這種情況下,這一天的價值應該爲零。 使用查詢結果,我可以遍歷每一天,並檢查結果是否包含當天的總和。如果是這樣,我會退還這筆款項。否則,我會返回零。但是,這不是按要求的單步LINQ查詢。 – 2010-05-16 19:22:18
我看到你的編輯。非常好。 – 2010-05-16 19:40:05
@Jimmy:謝謝,但我認爲這個更好。 – 2010-05-16 19:45:53