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 按多条记录分组的主要内容,如果未能解决你的问题,请参考以下文章