2013-01-22 2 views
0

My Log 클래스에는 2 개의 속성이 있습니다. 이 수명을 객체 동안Linq로 필터링하는 방법

string Message 
LogStatus LogStatus //enum 

그것은 나중 단계에서 로그온에 저장되어있는 많은 메시지를 수신 :

List<LogDetails> 
string Title 

그리고 내 LogDetails 클래스는 두 속성이 있습니다. LogStatus Enum에는 몇 가지 상태가 있지만 단순히 "진행 중", "파일을 찾을 수 없음 오류", "성공"또는 "실패"중 하나입니다.

저는 Linq를 사용하여 실패한 항목 만 일치 시키려하지만 새로운 유형을 구축 할 수 없습니다.

List<Log> filteredLogs = (from a in logs 
          from b in a.LogDetailsList 
          where b.Status == LogDetails.LogStatus.Failed 
          select new Log() 
            { 
            Title = a.Title, 
            LogDetailsList = a.LogDetailsList 
            }).Distinct().ToList(); 

내 필터링 된 로그는 where 절이 작동하지 않은 것처럼 전체 목록을 나에게 반환합니다.

내가

List<Log> filteredLogs = (from a in logs 
          from b in a.LogDetailsList 
          where b.Status == LogDetails.LogStatus.Failed 
          select new Log() 
            { 
             Title = a.Title, 
             LogDetailsList = new LogDetails() { Message = b.Message, Status = b.Status } 
            }).Distinct().ToList(); 

이 작동하지 않는 시도 중 하나는 내가 LINQ 쿼리 내에서 ToList() 메소드를 호출 할 수 없습니다 나타나는.

편집

어느 한이 문제를 해결하는 방법에 대한 제안 사항이 있습니까? 내 목표는 실패한 목록 만 나열하는 목록을 만드는 것입니다.

답변

2

"중첩 된"LogDetails 목록에 Enumerable.Any을 사용하십시오.

List<Log> failedLogs = logs 
      .Where(l => l.LogDetails.Any(ld => ld.LogStatus==LogStatus.Failed)) 
      .ToList(); 

이렇게하면 하나 이상의 로그 세부 정보에 LogStatus.Failed이있는 모든 로그가 반환됩니다.

여기에 Demo이 있습니다.

+0

너무 쉽게 보이게해야 했습니까? :) 나는 어떤 것을 사용하지 않았기 때문에 연구하기 전에. – Dave

+0

@DaveRook : 위 쿼리는 'LogStatus'가'LogStatus.Failed' 인 하나 또는 여러 개의 로그 세부 정보가있는 로그 만 다시 검색합니다. 모든 세부 사항이 대신 실패한 로그를 찾으십니까? –

+0

예. 나는 실패한 사람들에게만, 다른 어떤 것에는 미치지 않습니다. – Dave