C# 仅当上一行中的字段少于活动行中的字段时,才选择行

C# 仅当上一行中的字段少于活动行中的字段时,才选择行,c#,linq,entity-framework,tsql,linq-to-entities,C#,Linq,Entity Framework,Tsql,Linq To Entities,我想知道是否可以创建一个查询,仅当前一行中的字段的值小于实际行中的值时,该查询才会选择一行 如果您选中此屏幕截图: 将不选择等于7的ID,因为它后面的行的值小于实际值。因此,我想知道是否有LINQ to Entities命令可以帮助我从选择结果中排除id为7的行。如果您的id保证是连续的,您可以通过id将表本身连接到id-1上 var q = from x in test join y in test on x.ID equals y.ID - 1 where y

我想知道是否可以创建一个查询,仅当前一行中的字段的值小于实际行中的值时,该查询才会选择一行

如果您选中此屏幕截图:


将不选择等于7的ID,因为它后面的行的值小于实际值。因此,我想知道是否有LINQ to Entities命令可以帮助我从选择结果中排除id为7的行。

如果您的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;
另外,如果您想要最后一行,您可以只在末尾添加或x.NextID为null


由于SQL是声明性的,DBMS可以就如何检索结果做出大量决策,这可能涉及多线程

发生这种情况时,无法保证线程的完成顺序,因此也无法保证返回结果的顺序,即使您定义了主键。这是一个很好的解释


因此,我建议按数据库对连续编号进行排序,但要确保结果从数据库中返回后会进行排序,然后对C中的排序结果集进行筛选。

如果表不太大,无法提取所有记录,编写一个执行过滤的扩展方法可能更容易。对不起,我不太理解您的意思:

public static class MyTypeExtensions
{
    public static IEnumerable<MyType> FilterOnStopOrder(this IEnumerable<MyType> source)
    {
        MyType previous = null;
        foreach (var item in source.OrderBy(s => s.ID))
        {
            // or whatever condition... 
            if (previous != null && previous.StopOrder < item.StopOrder)
            {
                yield return item;
            }

            previous = item;
        }
    }
}

@Silvermind如果ID之间存在间隙,则它不起作用。如果是我,我可能会转而使用sql中的行数,而不是将其硬塞进linq中。@Laurence你说得对,我主要关注代码,很抱歉,这似乎是一种常见的数据模型。也许如果你解释了更高层次的问题,你的问题可能会有一个更好的模型
public static class MyTypeExtensions
{
    public static IEnumerable<MyType> FilterOnStopOrder(this IEnumerable<MyType> source)
    {
        MyType previous = null;
        foreach (var item in source.OrderBy(s => s.ID))
        {
            // or whatever condition... 
            if (previous != null && previous.StopOrder < item.StopOrder)
            {
                yield return item;
            }

            previous = item;
        }
    }
}