Feuilles de time: Récupérer des données en utilisant SQL, LINQ ou class?

Mon problème est que je veux une grid qui est peuplée avec un set de fois passé sur des tâches. Il doit avoir les jours de la semaine au sumt (ceux-ci seraient de preference fixés – c'est-à-dire Dim, Lun … Sam) et les noms des tâches dans la colonne de gauche. Le contenu de la grid aura les heures individuelles consacrées à ce jour pour cette tâche.

Quelle serait la meilleure approche à adopter pour y parvenir? La première option serait d'essayer de tout mettre dans les instructions SQL de la database. L'option deux est une collection de requêtes LINQ qui extraient des données brutes d'une tâche et d'une heure et la structurent correctement. L'option trois est d'utiliser LINQ et de tirer les résultats dans une class (ou collection), qui est ensuite liée au contrôle (probablement une grid).

Comment ferais-tu ceci?

Je vais prendre un hack grossier sans connaître votre structure mais en supposant que vous avez une table des tâches et une table des tâches qui stocke les heures et les dates réelles qui sont facturés à chaque tâche. Ceci n'est pas testé mais:

select t.taskname, sum (cas où datepart (d, tt.taskdate) = 1, tt.taskhours) else 0 end) comme dimanche, sum (cas où datepart (d, tt.taskdate) = 2, t.taskhours) else 0 end) comme lundi à partir de tasktable t joindre tasktime tt sur t.taskid = tt.taskid où tt.taskdate> = @begindate et tt.taskdate <= @enddate

La clause where est importante car vous ne souhaitez probablement afficher qu'une semaine à la fois (généralement la semaine en cours) sur votre grid. Cela suppose également que vous avez correctement stocké les dates de vos heures chargées en tant que type de données datetime. (Si vous n'avez pas résolu cela maintenant – vous me remercierez plus tard.) Les variables seraient soumises à partir de l'interface user d'une certaine manière. Personnellement, je le ferais comme un proc stocké. Je suis parti mardi jusqu'au samedi pour que tu le fasses.

Vous semblez impliquer que datatables résident actuellement dans une database. La solution optimale dépend de la quantité de traitement interne des données et de l'infrastructure existante du projet.

J'utiliserais une grosse requête SQL pour rassembler toutes datatables et lier ResultSet le ResultSet à la grid (peu ou pas de traitement ou d'infrastructure) ou utiliser LINQ pour remplir un type de class TimeSheetModel , en utilisant l'infrastructure existante et en permettant un traitement ultérieur.

Vous pouvez utiliser LinqToSql pour récupérer les lignes en memory, puis LinqToObjects pour agréger ces lignes dans votre format de table (il s'agit d'une agrégation pivotante).

Ce message montre une requête pivot linq. Dans votre cas, cela fonctionnera très bien, puisque vous connaissez les colonnes que vous voulez produire au moment du design. Commande SQL à LINQ (pivotant)

Je recommand d'utiliser 0 classs anonymes. Il devrait y avoir (au minimum) une class qui représente une ligne dans la database et une class qui représente les valeurs d'une ligne dans la grid.


Et parce que je peux dire tout ce que je veux ici, je voulais commenter la technique SUM (CASE) de HLGEM. Je l'ai déjà utilisé sur des rapports où je devais écrire uniquement en SQL. Cela fonctionne très bien … si vous voulez écrire en SQL.