2014-12-13 2 views
-1

경마 관련 데이터 세트가있는 문제에 대한 작업. 여기처럼 :Linq 하위 쿼리 - take 함께

 outingsData = new List<RPOutingFull>(); 
     outingsData.Add(new RPOutingFull() { ID = 1, HorseID = hid1, FinishPositionVal = winPos, theDate = outingsStartDate.AddDays(-5) }); 
     outingsData.Add(new RPOutingFull() { ID = 2, HorseID = hid1, FinishPositionVal = winPos, theDate = outingsStartDate.AddDays(-4) }); 
     outingsData.Add(new RPOutingFull() { ID = 99, HorseID = 2, FinishPositionVal = winPos, theDate = outingsStartDate.AddDays(-4) }); 
     outingsData.Add(new RPOutingFull() { ID = 3, HorseID = hid1, FinishPositionVal = 3, theDate = outingsStartDate.AddDays(-1) }); 
     outingsData.Add(new RPOutingFull() { ID = 4, HorseID = hid1, FinishPositionVal = 3, theDate = outingsStartDate.AddDays(+1) }); 
     outingsData.Add(new RPOutingFull() { ID = 5, HorseID = hid1, FinishPositionVal = 6, theDate = outingsStartDate.AddDays(+4) }); 
     outingsData.Add(new RPOutingFull() { ID = 6, HorseID = hid1, FinishPositionVal = winPos, theDate = outingsStartDate.AddDays(+5) }); 
     outingsData.Add(new RPOutingFull() { ID = 7, HorseID = hid1, FinishPositionVal = winPos, theDate = outingsStartDate.AddDays(+22) }); 
     outingsData.Add(new RPOutingFull() { ID = 8, HorseID = 3, FinishPositionVal = winPos, theDate = outingsStartDate.AddDays(+22) }); 
     outingsData.Add(new RPOutingFull() { ID = 9, HorseID = 5, FinishPositionVal = 2, theDate = outingsStartDate.AddDays(+27) }); 
     outingsData.Add(new RPOutingFull() { ID = 10, HorseID = 5, FinishPositionVal = 4, theDate = outingsStartDate.AddDays(+55) }); 
     outingsData.Add(new RPOutingFull() { ID = 11, HorseID = 5, FinishPositionVal = 4, theDate = outingsStartDate.AddDays(+56) }); 
     outingsData.Add(new RPOutingFull() { ID = 12, HorseID = 5, FinishPositionVal = 5, theDate = outingsStartDate.AddDays(+95) }); 
     outingsData.Add(new RPOutingFull() { ID = 13, HorseID = 5, FinishPositionVal = 6, theDate = outingsStartDate.AddDays(+96) }); 

내가 LINQ 쿼리 작성하려면 - 데이터의 초기 항목을 선택 술어를 제공하고, 각 자격 말

예에 대한 후속 X의 레코드를 반환; 이 데이터 및 FinishPositionVal = 3을 갖는 초기 항목의 술어를 주어, 모든 매칭 주자 후속 등판 2 복용 ... 아이디 4,5,6

 // take next 2 outings 
     int takeCount = 2; 
     Predicate<RPOutingFull> predicate = full => full.FinishPositionVal == 3; 

     var resAllSubsequentOutings = (from s1 in outingsData 
        from s2 in outingsData 
        where 
        s2.theDate > s1.theDate && s1.HorseID == s2.HorseID && 
        predicate(s1) 
        orderby s1.theDate 
        select s2); 

이 부분은 반환 된 항목을 리턴해야 초기 술어가 일치하는 모든 후속 작업 이 반환 세트를 그룹화하고 각 주자에서 최상위 x를 가져올 수는 있지만 올바른 것은 아닙니다. 왜냐하면 ..... 술어는 ID 3, 4 (위치 = 3)에서 데이터의 두 개의 개별 지점에서 독립적으로 시작 했으므로 테이크는 각 지점에서 두 번 연속해서 수행해야합니다 (예 : ID 4, 5는 ID3 일치 조건부로 인해 선택해야하며 ID5는 ID4 일치 조건부로 인해 선택됩니다. 그러면 4,5,5가 구별됩니다.

 CollectionAssert.AreEquivalent(new List<long>() { 4, 5, 6 }, resMissingQuery.Select(o => o.ID)); 

감사

매트 코를 들어
+0

은 쿼리를 적응 한 후이에 대한 해결책을 찾았 http://stackoverflow.com/questions/880665/stuck-on -a-부질-즉-IS-그룹화 된 - LINQ –

+0

해결책 : VAR의 Q = (S1에서의 g ( 에서 outingsData 에서의 S2의 outingsData 여기서 s2.theDate> s1.theDate && s1.HorseID = = s2.HorseID && 술어 (s1) orderby s1.theDate select s2) .Take (takeCount) select g). 구분) .ToList(); –

+0

성능을 향상시키기 위해 조인 쿼리로 다시 작성하려고합니다 .... 그렇게 쉽지 않습니다. 어떤 도움을 주셔서 감사합니다. –

답변

0

, 내가 함께 왔어요 조인 쿼리입니다 : 이것은 후속 실행을 받고에서 작동

 Predicate<RPOutingWithNoComment> predicate = r => r.FinishPositionVal == 3; 
     var res = (from s1 in _testData 
        join s2 in _testData on s1.HorseID equals s2.HorseID 
        where s2.theDate > s1.theDate && 
         s1.HorseID == s2.HorseID && predicate(s1) 
        orderby s2.theDate 
        select s2).Distinct(); 

, 이제 초기 실행 조건자가 실행을 선택한 후 후속 실행 중 단 2 개만 수행하도록 결과 집합을 제한하려고합니다. 나는 자격을 실행 한 후에 만 ​​다음 실행을 얻기 위해, 알고, 내가 사용할 수 있습니다

 var q = from r in res 
      group r by r.HorseID 
      into g 
      select g.OrderBy(o => o.theDate).First();