2010-04-15 4 views
0

Il devrait y avoir une simple requête Linq pour ce que j'essaie d'accomplir, mais je produis un code moche.Aidez-moi à construire cette déclaration Linq

J'ai deux tables, une de problèmes et une autre d'état de problème. Il existe une relation un-à-plusieurs entre le problème et l'état du problème. Quand un problème est créé, un IssueStatus est également créé avec le champ d'état défini sur «Open» lorsqu'il est fermé, un autre IssueStatus est créé avec le champ d'état défini sur «Closed» ... mais les problèmes peuvent être rouverts. Il semble que je devrais pouvoir écrire quelque chose comme ceci:

public static List<Issue> FindOpenIssues(this IList<Issue> issues) { 
     return (
      from issue in issues 
      from issueStatus in issue.issueStatus.OrderByDescending(x=>x.CreatedOn).Single() 
      where issueStatus.Status == "Open" 
      select issue 
      ).ToList(); 
    } 

Cela échoue évidemment, mais il doit y avoir une manière propre à le faire? Merci! Edit: Comme le souligne Reed Copsey, mon intention est de trouver les problèmes en cours. Un problème peut contenir un élément "Ouvrir" et à une date ultérieure, un élément "Fermé" ... c'est pourquoi un simple Où = "Ouvrir" ne fonctionnera pas, il doit trouver l'élément avec la date la plus récente dans la liste pour déterminer l'état du problème.

Répondre

2

Il semble que vous essayiez de trouver des problèmes avec un état marqué "Ouvrir". Si oui, cela devrait fonctionner:

public static List<Issue> FindOpenIssues(this IList<Issue> issues) { 
    return issues 
       .Where(i => i.issueStatus.Any(stat => stat.Status == "Open") 
       .ToList(); 
} 

Ceci est différent de l'original, mais sur la base du nom de la méthode, je crois que peut réellement fournir les résultats escomptés (toutes les questions où il y a un état ouvert).

Vous pouvez faire ce que serait retourné par votre original comme ceci:

public static List<Issue> FindOpenIssues(this IList<Issue> issues) { 
    return issues 
      .Where(i => i.issueStatus 
          // This potentially should be (I left your original logic, though): 
          // .OrderByDescending(stat => stat.CreatedOn) 
          .OrderBy(stat => stat.CreatedOn) 
          .First() 
          .Status == "Open" 
       ) 
      .ToList(); 
} 
+0

Est-ce que ** chaque ** problème n'est pas ouvert au moins à la fois? Donc, cela sélectionnerait tous les problèmes, non? – dtb

+0

dtb: Pas si les problèmes sont marqués comme étant fermés après qu'ils ont été complétés. Bien que j'ai réécrit pour fournir le comportement original ... –

+0

Merci, fonctionne parfaitement! Juste testé contre mon projet. Vous avez raison, OrderBy aurait dû être OrderByDescending. –

1

En supposant que vous souhaitez conserver un historique des statuts d'émission pour chaque problème, vous pouvez sélectionner à l'aide de cette toutes les questions où le dernier état d'émission (à savoir le premier statut d'émission décroissant triés par date de création) est « ouverte »:

return issues.Where(issue => issue.issueStatus 
            .OrderByDescending(x => x.CreatedOn) 
            .First() 
            .Status == "Open") 
      .ToList(); 
+1

Ceci est différent - il est issueStatus.Status == "Open", et pas seulement l'instance issueStatus ... vous –

+0

besoin d'ajouter '.Status' après le' .First() ' –

0
issues.Where(issue=>issue.issueStatus 
.Where(issueStat=>issueStat.Status==Open) 
.OrderBy(x=>x.createdOn).Single()).ToList()