Linq to sql 按多条记录分组

Posted

技术标签:

【中文标题】Linq to sql 按多条记录分组【英文标题】:Linq to sql group by a number of records 【发布时间】:2011-11-16 15:05:07 【问题描述】:

有没有办法创建一个 linq to sql 查询以按 Take 参数分组?

例如,如果我有一个包含 20 条记录的表,其中一个唯一 ID 值从 1 到 20,我想获得一组按 5 条记录分组的记录:

Group 1: 1,2,3,4,5
Group 2: 6,7,8,9,10
....

我可以想到两种方法来做到这一点

通过 5 次查询: 计算总记录的第一个查询,接下来的 4 个查询将是我跳过 5 并取 5 的选择查询。

通过进行一次查询,使用内部索引循环遍历结果并使用 5 个组创建对象

有没有更优雅的方法来使用 linq to sql 做到这一点?

【问题讨论】:

我会在表中添加一个“groupId”字段并在 group by 子句中使用该字段 orderBy 可能并不总是相同的,所以在不同的情况下,item 可以有不同的组 简短的回答是 linq 没有内置任何东西,除了跳过/获取。这是用于分页表吗?只是想知道为什么您需要一口气获得所有组。我通常会先计数,然后在用户翻阅页面时跳过/拍摄。 我在一个站点中有一个菜单,其中一个级别中有太多菜单项导致设计任性,因此作为一种解决方案,我计划将一个级别的项目分组为 10 个或节省垂直空间的东西。我知道我可以采用其中一种解决方案,但我想知道是否有一种更短、更优雅的方法(我记得 Rails 对同样的问题有一个非常优雅的解决方案) 【参考方案1】:

你的第二个想法正是我会做的。只需从数据库中获取所有内容并在 .NET 端循环。可能有一些方法可以使用 Aggregate 以更类似于 LINQ 的方式进行操作,但我相信它们会更难阅读。如果您以惰性方式执行此操作(使用 yield 来实现枚举器),您仍将只循环一次序列,因此您不会失去性能。

【讨论】:

【参考方案2】:

如果您最终还是要从数据库中检索所有记录,为什么不直接执行它,然后使用这样的方法:

collection.GroupBy(x => collection.IndexOf(x) / 5);

【讨论】:

我用我能想到的最简单的数据做了一个例子,实际的表没有1到20的值 collection.GroupBy(x => collection.IndexOf(x) / 5);【参考方案3】:

你可以这样分组吗

var items = from i in arr
                let m = i / 5
                group i by m into d
                select new  d ;

如果你有 10 个元素,它将创建两组,每组 5 个

【讨论】:

【参考方案4】:

按原样提取数据,将其提供给容器然后将它们拆分。

您的查询永远不应该,永远了解有关他们提取的数据如何显示给用户的任何事情。

【讨论】:

以上是关于Linq to sql 按多条记录分组的主要内容,如果未能解决你的问题,请参考以下文章

sql语句,合并多条记录中的相同字段。

Linq-To-Sql ORM 更新一对多

T/SQL - 分组/多条记录

Linq to sql,聚合列,按日期分组到列表视图

选择日期范围,根据关闭条件计算范围内的多条记录,按班次分组

Linq:按 OR 条件分组