Linq join avec la dernière instance dans la table

J'ai une table de workflow qui prend toutes les étapes d'un process. Permet de travailler avec 2 de ces statuts:

  1. Enregistré (nouvel élément enregistré mais pas encore envoyé)
  2. Soumis (article soumis pour révision)

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:

entrez la description de l'image ici

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:

entrez la description de l'image ici

À 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() }