경마 관련 데이터 세트가있는 문제에 대한 작업. 여기처럼 :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));
감사
매트 코를 들어
은 쿼리를 적응 한 후이에 대한 해결책을 찾았 http://stackoverflow.com/questions/880665/stuck-on -a-부질-즉-IS-그룹화 된 - LINQ –
해결책 : 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(); –
성능을 향상시키기 위해 조인 쿼리로 다시 작성하려고합니다 .... 그렇게 쉽지 않습니다. 어떤 도움을 주셔서 감사합니다. –