J'ai actuellement le code suivant pour générer un rapport de vente au cours des 30 derniers jours. J'aimerais savoir s'il serait possible d'utiliser linq pour générer ce rapport en une seule étape au lieu de la boucle plutôt basique que j'ai ici.Utiliser Linq to SQL pour générer le rapport des ventes
Pour mes besoins, chaque jour doit me retourner une valeur, donc s'il n'y a aucune vente pour un jour, alors un 0 est retourné. L'un des exemples Sum linq n'explique pas comment il serait possible d'inclure un filtre where, donc je suis confus sur la façon d'obtenir le montant total par jour, ou un 0 si aucune vente, pour la dernière fois. jours que je traverse.
Merci pour votre aide, Rich
//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: Johannes réponse était une excellente façon de gérer ma requête. Vous trouverez ci-dessous un ajustement au code pour le faire fonctionner pour cet exemple au cas où quelqu'un d'autre aurait ce problème. Cela va effectuer une jointure externe à partir de la table allDays et retourner des valeurs 0 lorsqu'il n'y a pas de ventes pour ce jour.
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 };
je suis venu avec cette solution aussi, mais la demande semble inclure jours pour lesquels aucune ligne ne sont renvoyés. Dans un tel cas, la valeur devrait être nulle pour un tel jour. En utilisant le résultat de la requête, je pourrais parcourir chaque jour et vérifier si le résultat contient une somme pour ce jour. Si oui, je vais retourner la somme. Sinon, je reviendrai à zéro. Cependant, il ne s'agit pas d'une requête LINQ en une seule étape, comme demandé. –
Je vois votre édition. Très agréable. –
@Jimmy: Merci, mais je pense que celui-ci est encore plus agréable. –