-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));
感谢
找到了解决这个从适应查询后: http://stackoverflow.com/questions/880665/stuck-on -a-子查询 - 即-是-分组功能于LINQ – 2014-12-13 20:32:38
解决方案: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
我想重新写这个作为一个连接查询来提高性能....那不是那么容易。任何帮助赞赏。 – 2014-12-14 00:38:49