如果您的 id 保证是连续的,您可以通过 id 将表连接到 id -1 上
var q = from x in test
join y in test on x.ID equals y.ID - 1
where y.StopOrder >= y.ID
select x;
你必须考虑边界条件,你可能想要一个左连接的等价物。
如果您的 id 不连续,您可以执行以下操作:
var q = from x in test
from y in test
where y.ID > x.ID
group y by x into g
where g.Min().ID <= g.Min().StopOrder
select g.Key;
为此,您需要在表类型上定义 IComparable。在我的测试中,我使用了:
struct X: IComparable<X> {
public int ID;
public int StopOrder;
public int CompareTo (X other) {
return ID.CompareTo(other.ID);
}
}
这仍然永远不会返回最后一行。
如果您使用的是 SQL2012 或更高版本并且想要下拉到 SQL,您可以使用 lead 函数。这只会扫描一次表(假设 ID 上有一个索引):
with x as (
select
t.ID,
t.StopOrder,
lead(id, 1) over (order by id) as NextID,
lead(StopOrder, 1) over (order by id) as NextStopOrder
from
test t
) select
x.ID,
x.StopOrder
from
x
where
x.NextId <= x.NextStopOrder;
另外,如果你想要最后一行,你可以在末尾添加or x.NextID is null
Example SQLFiddle