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 Voici la requête: strong> p> < Pré> xxx pré> si j'ai des données pour 12/1 - 12/4/2009 comme (simplifié): p> je veux une entrée avec < fort> 12/3/2009 0 strong> ajouté par code. P> 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
peut-il être fait à Linq? Devrait-il être fait à Linq? Strong> p> p>
4 Réponses :
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 p>
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.
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 p>
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: p>
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.
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 });
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
Dupliqué possible de Groupe LINQ par date - Inclure des jours vides sans Utiliser Join