8
votes

Remplir des dates manquantes à l'aide d'un groupe LINQ par requête de date

J'ai une requête LINQ qui compte essentiellement du nombre d'entrées créées un jour particulier, ce qui se fait en regroupant par année, mois, jour . Le problème est que, car certains jours n'auront pas d'entrées, je dois récupérer les "jours civils" manquants avec une entrée de 0 comptage. Je suppose que cela peut probablement être fait avec un syndicat ou quelque chose ou peut-être même une simple boucle pour traiter les enregistrements après la requête.

Voici la requête: < Pré> xxx

si j'ai des données pour 12/1 - 12/4/2009 comme (simplifié): xxx

je veux une entrée avec < fort> 12/3/2009 0 ajouté par code.

Je sais que, en général, cela devrait être fait dans la DB à l'aide d'une table dénormalisée que vous remplissez avec des données ou une jointure à un calendrier Tableau, mais ma question est de savoir comment cela pourrais-je accomplir cela en code?

peut-il être fait à Linq? Devrait-il être fait à Linq?


4 Réponses :


0
votes

Vous pouvez générer la liste des dates à partir de "Démarrer" et se terminant à "Terminer", une étape d'étape par étape, vérifiez le nombre de comptes pour chaque date séparément


1 commentaires

C'est bon, mais je voulais voir comment cela peut être fait en utilisant des constructions de Linq comme l'opérateur de l'Union.



1
votes

essentiellement ce que j'ai fini ici, c'est créer une liste du même type avec toutes les dates de la plage et 0 valeur pour le compte. Puis syndicatez les résultats de ma requête originale avec cette liste. Le major Hurdle créait simplement un iéquality CustomAlityComerer. Pour plus de détails ici: Cliquez ici


0 commentaires

2
votes

Je viens de le faire aujourd'hui. J'ai rassemblé les données complètes de la base de données, puis a généré une table "échantillon vide". Enfin, j'ai fait une jointure externe de la table vide avec les données réelles et utilisée la construction defaRéDempty () pour traiter de savoir quand une ligne manquait de la base de données pour le remplir avec les valeurs par défaut.

Voici mon code: xxx


1 commentaires

C'est très similaire à ce que j'ai fini par faire, mais a fait une union sur les résultats au lieu d'effectuer une jointure.



2
votes

J'ai fait une fonction d'assistance conçue pour être utilisée avec des types anonymes et réutilisé aussi générique que possible.

Disons que ceci est votre requête pour obtenir une liste de commandes pour chaque date. P>

// first you must determine your desired list of dates which must be in order
// determine this however you want    
var desiredDates = ....; 

// fill in any holes
var ordersByDate = FillInEmptyDates(desiredDates, 

                               // Source list (with holes)
                               orders, 

                               // How do we get a date from an order
                               (order) => order.OrderDate,

                               // How do we create an 'empty' item 
                               (date) => new 
                               {
                                     OrderDate = date,
                                     OrderCount = 0,
                                     Sales = 0
                               });


1 commentaires

Je pense que c'est un scénario «d'affaires» aussi spécifique que je pense essayer de le presser dans une construction «élégante» Linq est contre-productive - mais c'était la deuxième chose la plus élégante que je pouvais trouver