2010-04-15 2 views
0

내가 뭘 하려는지에 대한 간단한 Linq 쿼리가 있어야하지만, 나는 못생긴 코드를 만들고있다.이 Linq 문을 구성하는 데 도움이

두 테이블 중 하나는 문제이고 다른 하나는 문제 상태입니다. 이슈와 이슈 상태간에 일대 다의 관계가 있습니다. 이슈가 생성되면 이슈가 닫힐 때 상태 필드가 "열림"으로 설정된 이슈 상태가 생성되고 상태 필드가 "닫힘"으로 설정된 또 다른 이슈 상태가 생성되지만 문제는 다시 열릴 수 있습니다. 내가 이런 걸 쓸 수있을 것 같아 :

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

이 분명히 실패,하지만이 작업을 수행하는 깨끗한 방법이 있어야합니다? 감사!

편집 : Reed Copsey가 지적했듯이, 현재 의도하지 않은 바를 찾아야합니다. 이슈는 "Open"요소를 포함하고 나중에 "Closed"요소를 포함 할 수 있습니다 ... 이것은 단순한 Where == "Open"이 작동하지 않는 이유이며, 가장 최근 날짜의 요소를 찾아야합니다 목록에서 문제의 상태를 확인하십시오.

답변

2

"열림"상태의 문제를 찾으려고하는 것 같습니다. 이것은 원래 다른

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

하지만, 메소드 이름에 따라, 실제로 의도 된 결과 (오픈의 상태가 문제를) 제공 할 수 있습니다 생각 : 그렇다면,이 작업을해야합니다.

당신과 같이 원래에 의해 반환되는 일을 할 수 있습니다

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

적어도 ** 모든 ** 문제는 한번에 열지 않습니까? 그래서 이것은 모든 이슈를 선택하게 될 것입니다, 그렇죠? – dtb

+0

dtb : 문제가 완료된 후에 닫히는 것으로 표시되지 않는 경우. 나는 원래의 행동을 제공하기 위해 다시 작성했지만 ... –

+0

감사합니다, 완벽하게 작동합니다! 그냥 내 프로젝트에 대해 테스트. 당신은 OrderBy가 OrderByDescending 일 것임에 틀림 없습니다. –

1

이 사용하여 최신 문제 상태 (내림차순 생성 날짜별로 정렬 즉, 첫 번째 문제 상태) "열기"모든 문제를 선택할 수있는 모든 문제에 대한 문제 상태의 기록을 유지하는 가정 :

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

이 다른 - 그것은 issueStatus.Status == "열기"는 것뿐 아니라 issueStatus 인스턴스 ... –

+0

당신에게 '.First()'뒤에'.Status'를 추가 할 필요가 있습니다 –

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