В настоящее время у меня есть следующий код для создания отчета о продажах за последние 30 дней. Я хотел бы знать, возможно ли использовать linq для генерации этого отчета за один шаг вместо довольно простого цикла, который у меня здесь есть.
По моему требованию каждый день должен возвращать мне значение, поэтому, если в течение какого-либо дня нет продаж, возвращается 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);
}
}
EDIT:
Ответ Йоханнеса был отличным способом справиться с моим запросом. Ниже приведена корректировка кода, чтобы он работал в этом примере на случай, если у кого-то еще возникнет эта проблема. Это выполнит внешнее объединение из таблицы 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 };