2014-10-21 3 views
1

특정 간격으로 실행되는 여러 테스트가있는 작업이있는 경우가 있습니다. 작업 실행은 기본적으로 고유 한 RunId (GUID)로 특정 실행을 그룹화하는 여러 결과를 참조하는 데 사용되는 GUID 인 고유 한 TestRunId를 생성합니다.단일 열에 대한 LINQ Groupby 쿼리

이제 문제는 생성 된 고유 실행을 선택해야하지만 내 LINQ 쿼리가 모든 실행을 선택한다는 것입니다.

나는이

var testRunIds = ((from tests in context.testresults 
            where tests.JobId == jobId 
            select new 
            { 
             tests.TestRunId 
            }).GroupBy(t=>t.TestRunId).OrderBy(t=>t.Key).Skip((pagenum - 1) * pagesize).Take(pagesize)).ToList(); 

처럼 뭔가를 시도하지만 말했듯이,이 쿼리는 각각의 모든 testResult을 선택합니다. 지금 내가 어떻게하는지 잘 모르겠다. 나는 Distinct()를 시도했으나 그것도 작동하지 않았다. 아래 샘플 데이터.

Sample data

감사

나는 나는 그것의 본질적 그룹 등 여러 TestRunId 값을 가지고 있다는 문제가있다 생각합니다. 내가 필요로하는 것을 달성하기 위해 중위, 나는 사용하여 시도 (가지고 Linqer 사용)

from Queries in db.TestResult 
where 
    Queries.JobId == 1 
group Queries by new { 
    Queries.TestRunId, 
    Queries.StartTime, 
    Queries.EndTime 
} into g 
orderby 
    g.Key.TestRunId 
select new { 
    _ID = (int?)g.Max(p => p.Id), 
    g.Key.TestRunId, 
    g.Key.StartTime, 
    g.Key.EndTime 
} 

을하지만 이것은 단지 본질적으로

SELECT max(id)[ ID], 
TestRunId, 
StartTime, 
Endtime 
FROM dbo.query where jobid = 1 group by TestRunId,StartTime,Endtime order by StartTime; 

하지만 내가 필요로하는

SELECT TestRunId,StartTime,Endtime FROM testresult where jobid = 1 group by TestRunId order by StartTime; 
입니다 MSSQL 데이터 소스 작동 MySQL 용

+0

작동해야하지만 'TestRunId'를 저장하기 위해 익명 개체를 생성 할 필요는 없습니다. 어쩌면 그냥'tests.JobId == jobId select tests.TestRunId) .Distinct()'가 더 잘 작동할까요? – Rhumborl

+0

나는 그것을 시도했지만 익명의 객체를 생성하지 않으면 강력한 유형을 사용하여 액세스 할 수 없다. 이 경우, 나는이 테스트를 선택해야한다 .Distinct(). OrderBy (x => x.StartTime) .Skip ((pagenum - 1) * pagesize) .Take (pagesize)). ToList();'그러나 이것은 실용하지 못합니다. 같은 결과. 이 작업은'... 선택 테스트) .GroupBy (t => t.TestRunId)). OrderBy (x => x.Key) .Skip ((pagenum - 1) * pagesize) .Take (pagesize)) .ToList();'다시 같은 결과. – Navyseal

+0

예상되는 결과는 무엇입니까? testrunid에 의해 그룹을 만들 때 그 고유 한 testrunid와 연관된 여러 레코드가됩니다. 기대하는 샘플 출력을 표시 할 수 있습니까? –

답변

0

나를 도와 주셔서 감사합니다. 나는 이것을 2 단계 과정으로 관리했다.

 var testRunIds = (from tests in context.testresults 
          where tests.JobId == jobId 
          select new 
          { 
           tests.TestRunId, 
           tests.StartTime 
          }).OrderBy(x => x.StartTime).Skip((pagenum - 1) * pagesize).Take(pagesize).GroupBy(x=>x.TestRunId).ToList(); 

     var resultData = testRunIds.Select(testRunId => (context.testresults.Where(
      items => items.TestRunId == testRunId.Key)).FirstOrDefault()).ToList(); 
+0

좋습니다. 자신이 답을 받아 들일 수있는 해결책이 행복하다면. –

+0

21 시간 후에 대답을 받아 들일 수 있습니다. – Navyseal

1

난 당신이 가능성이 찾고있는 생각 :

var testRunIds = context.testresults.Where(t => t.JobId == jobId).OrderBy(t => t.starttime) 
    .Select(t => t.TestRunId).Distinct().Skip((pagenum - 1) * pagesize).Take(pagesize) 
    .ToList(); 

먼저, 다음 필요에 하나의 필드를 선택 주문 필터링 및 작업을 수행 한 후 다음 필요에 따라 취/스킵, 고유성 고유()를 사용합니다. 단일 입력란을 먼저 선택한 다음 해당 입력란이 더 이상 검색어의 일부가 아니기 때문에 표의 다른 입력란을 주문하거나 필터링하려고하면 해당 입력란이 작동하지 않습니다.

+0

@Navyseal 도움이 되었습니까? 그렇지 않다면 문제를 알리고 문제점을 명확히하여 답을 수정할 수 있도록하십시오. –

+0

안녕하세요 스티븐, 감사합니다. 그러나 실제로 도움이되지 않습니다. '메소드 '건너 뛰기'는 LINQ to Entities의 정렬 된 입력에 대해서만 지원됩니다. 메서드 'Skip'보다 먼저 'OrderBy'메서드를 호출해야합니다. '오류가 발생했습니다. OrderBy는 Skip() 직전에 호출되어야합니다. 하지만 그렇게하면 동일한 출력을 얻게됩니다. – Navyseal

+0

내가 생각하는 문제는 testRunId와 일치하는 레코드가 둘 이상있을 가능성이 있기 때문에 Max (Id)가있는 TestRunId를 사용해야합니다. 이 때문에 뚜렷한 별개의 일이 없습니다. – Navyseal

2

이 시도 : - Fiddle 작업

var jobs = context.testresults; 
      var query2 = jobs.Where(x => x.TestID == 1).OrderBy(x => x.StartTime).Select(x => x.TestRunID).Distinct(); 

.

+0

이제 startTime에서 결과를 정렬하고 코드를 업데이트해야한다고 귀하의 의견을 보았습니다. –

+0

시험해 주셔서 감사합니다. 그러나 도움이되지 않습니다. OP에 추가 의견을 추가했습니다. – Navyseal