2008-12-05 9 views
1

Mon problème est que je veux une grille qui est peuplée avec un ensemble de fois passé sur des tâches. Il doit avoir les jours de la semaine en haut (ceux-ci seront de préférence fixes - c'est-à-dire dim, lun ... sam) et les noms des tâches en bas de la colonne de gauche. Le contenu de la grille aura les heures individuelles consacrées à ce jour pour cette tâche.Feuilles de temps: Récupérer des données en utilisant SQL, LINQ ou classe?

Quelle serait la meilleure approche à adopter pour atteindre cet objectif? La première option serait d'essayer de tout mettre dans les instructions SQL de la base de données. 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 classe (ou collection), qui est ensuite liée au contrôle (probablement une grille).

Comment voulez-vous faire cela?

Répondre

3

Je vais faire un piratage brutal 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 chargées à chaque tâche. Ceci n'est pas testé, mais:

sélectionnez t.taskname, sum (cas où datepart (d, tt.taskdate) = 1, tt.taskhours) sinon 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 grille. 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 utilisateur 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.

+0

C'est certainement aboyer le bon arbre.Je vais faire une pause aujourd'hui et voir comment je vais. Upvote pour l'aide malgré tout, merci. –

+0

Ce n'est pas tout à fait ce que je cherche, mais la structure est un très bon guide pour commencer. Les déclarations de cas sont en grande partie ce que je cherche et une fois que je trouverai comment agréger les résultats correctement, je pense que je l'aurai craqué. Merci pour les conseils! –

1

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

je soit utiliser une grande requête SQL pour tirer toutes les données ensemble et lier le ResultSet directy au réseau (peu ou pas de traitement ou de l'infrastructure) ou utiliser LINQ pour remplir une sorte de TimeSheetModel classe, en utilisant les infrastructures existantes et permettant traitement ultérieur.

+0

J'aime l'idée de garder autant de données que possible entre les mains de la DB. Mais je me bats avec la structure de la requête. N'importe quel DBA là-bas? –

1

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

Cette publication 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. SQL command to LINQ (pivoting)

Je recommande d'utiliser 0 classes anonymes. Il devrait y avoir (au minimum) une classe qui représente une ligne dans la base de données et une classe qui représente les valeurs d'une ligne dans la grille.


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.

+0

Gaa! Autant de réponses correctes et utiles. LINQ est ma préférence, même si je n'ai aucun problème à utiliser SQL. J'ai le processus stocké fonctionnant maintenant de sorte que cela devrait fournir une bonne base à partir de laquelle traduire en LINQ. Je posterai à nouveau une fois que j'aurai un résultat. Merci pour le conseil. –

Questions connexes