2014-12-13 87 views
-1

處理一個有關賽馬數據的問題。喜歡這裏:Linq子查詢 - 帶

 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對所有匹配跑者...應的ID 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 ..但那不正確。因爲......謂詞獨立地從數據中的兩個獨立點開始:從ID3,4(其中位置= 3)開始,所以應該是從每個點開始2個隨後的外出......即ID4, 5應該由於ID3匹配謂詞而拾取,並且由於ID4匹配謂詞而拾取ID5,6 ...然後4,5,5,6個不同應該留下4,5,6 ....

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

感謝

+0

找到了解決這個從適應查詢後: http://stackoverflow.com/questions/880665/stuck-on -a-子查詢 - 即-是-分組功能於LINQ – 2014-12-13 20:32:38

+0

解決方案:VAR q =(從S1在outingsData 從克( 從S2在outingsData 其中 s2.theDate> s1.theDate && s1.HorseID = = s2.HorseID && 謂詞(s1) order by s1.theDate select s2).Take(takeCount) select g).Distinct ).ToList(); – 2014-12-13 20:33:05

+0

我想重新寫這個作爲一個連接查詢來提高性能....那不是那麼容易。任何幫助讚賞。 – 2014-12-14 00:38:49

回答

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

這部作品讓後續的運行中,現在我想限制結果集僅在初始運行謂詞選擇運行之後接下來的兩次運行。我知道,只獲得排位賽之後的下一次運行,我可以使用:

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