2011-11-16 95 views
2

有没有办法创建一个LINQ到SQL查询分组由Take参数?LINQ到SQL组由多个记录

举例来说,如果我有一个具有20条记录从1至20中的一个唯一的ID值的表,我想获得的5条记录进行分组的一组记录:

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

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

通过使5个查询: 第一个查询通过使一个查询计数的总记录,并在接下来的4个查询将选择查询在那里我跳过5,并采取5

而且,循环通过结果一个内部索引和创建对象的组5

有没有更好的方法来做到这一点与linq到SQL?

+2

我想添加一个“groupId”字段到表中,并在组中使用该条款 – Alex

+0

orderBy可能并不总是相同的,所以在不同的情况下,项目可以有不同的组 – Atzoya

+0

简短的回答是,linq doesn除了跳过/取出之外,没有内置任何东西。这是一个分页表吗?只是想知道为什么你需要一次性得到所有的团体。我通常首先得到一个计数,然后在用户浏览页面时跳过/取得。 –

回答

1

你的第二个想法正是我要做的。只需从数据库和.NET端的循环中获取所有内容。可能有方法使用Aggregate以更LINQ方式进行,但我相信他们会更难阅读。如果你以懒惰的方式来做(使用yield来实现枚举器),你仍然只会遍历序列一次,所以你不会失去性能。

1

你能集团这样

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

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

1

如果你最终将会从数据库中检索的所有记录不管怎么说,为什么不直接继续,然后使用这样的事情:

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

+0

我用一个我能想到的最简单的数据做了一个例子,实际的表没有从1到20的值 – Atzoya

+0

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

+0

它是优雅的,但我认为它会破坏性能。 – Atzoya

1

将您的数据按原样提交给容器然后将其拆分。

您的疑问绝不应该,有史以来要知道关于如何向用户显示它们所提供的数据的任何内容。