J'ai une table de workflow qui prend toutes les étapes d'un process. Permet de travailler avec 2 de ces statuts:
Maintenant, je veux créer une fonction BatchSumbit qui soumettra tous les éléments non soumis. Pour cela, j'ai besoin de requestr pour tous les éléments qui a un statut de stream de travail "Saved". Toutes les inputs de stream de travail historiques pour l'élément existent toujours et il peut aller de "Soumis" à "Enregistré" plusieurs fois.
Voici la structure de la table:
Maintenant, je veux une requête linq qui me donnera ce dont j'ai besoin:
from wasteInformation in wasteDB.WasteInformations join workFlowHistory in wasteDB.WorkFlowHistories on wasteInformation.WasteInformationId equals workFlowHistory.WasteInformationId // Join with last instance in workflow table (where workflowHistory.DateAdded is greatest) where workFlowHistory.WorkFlowStep == "Saved" && wasteInformation.WasteProgrammeId == captureModel.WasteProgrammeId && wasteInformation.WasteSourceId == captureModel.WasteSourceId select new { WasteInformationId = wasteInformation.WasteInformationId, FinancialQuarter = wasteInformation.FinancialQuarter, FinancialYear = wasteInformation.FinancialYear, WasteProgrammeId = wasteInformation.WasteProgrammeId, WasteMonth = wasteInformation.WasteMonth, WasteYear = wasteInformation.WasteYear, DateCaptured = wasteInformation.DateCaptured, WasteSourceId = wasteInformation.WasteSourceId, WasteDate = wasteInformation.WasteDate }
La requête telle qu'elle est donnera toutes les inputs sauvegardées pour l'article. Je veux qu'il me donne l'article si la dernière input de cet article a un WorkFlowStep de "Saved"
Edit: J'ai quelque chose qui ressemble à ça fonctionne. Encore besoin de le tester un peu plus:
var SavedWasteInformation = wasteDB.WasteInformations.Where(wi => wi.WorkFlowHistories.FirstOrDefault(wf => wf.DateAdded == wi.WorkFlowHistories.Max(wf_in => wf_in.DateAdded)).WorkFlowStep == "Saved" && wi.WasteProgrammeId == captureModel.WasteProgrammeId && wi.WasteSourceId == captureModel.WasteSourceId);
Edit: Ma solution ci-dessus et Vladimirs ci-dessous semblent fonctionner, mais après avoir inspecté les plans d'exécution Vladimirs ressemble à la meilleure option:
À condition que vous ayez une collection de WorkFlowHistories
sur votre WasteInformation
je crois que cette requête sélectionnera WasteInformations
avec leur dernier WorkFlowHistory
(le cas échéant):
from wasteInformation in wasteDB.WasteInformations where wasteInformation.WasteProgrammeId == captureModel.WasteProgrammeId && wasteInformation.WasteSourceId == captureModel.WasteSourceId select new { WasteInformation = wasteInformation, LastSavedWorkFlowHistory = wasteInformation.WorkFlowHistories .Where(x => x.WorkFlowStep == "Saved") .OrderByDescending(x => x.DateAdded) .FirstOrDefalt() }