在某个 Id 之后选择项目/行

Posted

技术标签:

【中文标题】在某个 Id 之后选择项目/行【英文标题】:select items/rows after a certain Id 【发布时间】:2021-08-03 03:03:18 【问题描述】:

我有一个项目列表(linq to sql),可以按各种属性排序,不仅仅是Id asc/desc

如果列表仅按Id 排序, 我可以打电话给list.Where(o => o.Id > 123).Take(10)

是否有任何允许的 linq 方法/功能?

在 id 后面取 10 项 value = 123

【问题讨论】:

list.Where(...).OrderBy(o => o.Id).ThenBy(o => o.OtherProp).Take(10) id 是唯一的,所以如果我先 orderBy Id,在它排序 ThenBy 其他属性之后没有区别 好吧,把Id换成另一个属性就可以实现“可以按各种属性排序” 【参考方案1】:

SQL 没有行排序的概念,因此您不能在 SQL 的特定行之后请求它。但是,LINQ to Objects 可以使用它:

如果list 是根据您的查询创建的List<T>,只需使用SkipWhile

list.SkipWhile(o => o.Id != 123).Skip(1).Take(10)

如果list 是一个LINQ to SQL 查询,那么首先使用AsEnumerable,但要意识到这会将整个查询带到客户端:

list.AsEnumerable().SkipWhile(o => i.Id != 123).Skip(1).Take(10)

如果您知道排序并可以对其进行测试,则可以过滤并减少返回给客户端的数据量 1. 计算给定 Id 的最大重复排序和 2. 仅返回记录以大于或等于所需Id 的排序值的所需顺序:

var maxdup = list.GroupBy(o => o.someProp).Select(og => og.Count()).Max();
var ans = list.Orderby(o => o.someProp)
              .Where(o => o.someProp >= list.Where(o2 => o2.Id == 123).First().someProp)
              .Take(10+maxdup)
              .AsEnumerable()
              .SkipWhile(o => o.Id != 123).Skip(1)
              .Take(10);

【讨论】:

以上是关于在某个 Id 之后选择项目/行的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL:使用字母数字 ID 在特定值之后选择接下来的 100 行

SQL 选择表中的某些行,以便它们总和为某个值

在WORD中如何对某个段落进行悬挂缩进和首行缩进两个字符?

使用 jQuery 选择表格行的值

Jquery从表的第二行选择data-id

SQL 组行选择