Группа Linq to sql по количеству записей

Есть ли способ создать запрос linq to sql для группировки по параметру Take?

Например, если у меня есть таблица с 20 записями с одним уникальным значением идентификатора от 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?


person Atzoya    schedule 16.11.2011    source источник
comment
я бы добавил поле groupId в таблицу и использовал его в предложении group by   -  person Alex    schedule 16.11.2011
comment
OrderBy может не всегда быть одинаковым, поэтому в разных ситуациях элементы могут иметь разные группы.   -  person Atzoya    schedule 16.11.2011
comment
Короткий ответ: в linq нет ничего встроенного, кроме пропуска/взятия. Это для выгружаемой таблицы? Просто интересно, почему вам нужно получить все группы за один раз. Обычно я сначала подсчитываю, а затем пропускаю/делаю, когда пользователь пролистывает страницы.   -  person James McCormack    schedule 16.11.2011
comment
У меня есть меню на сайте, где слишком много пунктов меню на одном уровне, что приводит к тому, что дизайн идет своенравно, поэтому в качестве решения я планирую сгруппировать элементы с одного уровня в группы по 10 или что-то еще, чтобы сэкономить вертикальное пространство. Я знаю, что могу пойти с одним из решений, но я хотел знать, есть ли более короткий и элегантный способ сделать это (я помню, что у Rails было очень элегантное решение этой же проблемы)   -  person Atzoya    schedule 16.11.2011
comment
в этом случае я бы просто получил лот и прокрутил счетчик, используя мод, чтобы ввести перерывы в вашей группе.   -  person James McCormack    schedule 16.11.2011


Ответы (4)


Ваша вторая идея - это именно то, что я бы сделал. Просто получите все из базы данных и зациклите на стороне .NET. Вероятно, есть способы использовать Aggregate, чтобы сделать это более похожим на LINQ способом, но я уверен, что их будет сложнее читать. Если вы сделаете это ленивым способом (используйте yield для реализации перечислителя), вы все равно будете проходить последовательность только один раз, поэтому вы не потеряете производительность.

person Stilgar    schedule 16.11.2011

Если вы все равно собираетесь получить все записи из базы данных, почему бы просто не сделать это, а затем использовать что-то вроде этого:

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

person twaggs    schedule 16.11.2011
comment
Я сделал пример, используя самые простые данные, которые я мог придумать, фактическая таблица не имеет значений от 1 до 20. - person Atzoya; 16.11.2011
comment
collection.GroupBy(x => collection.IndexOf(x) / 5); - person twaggs; 16.11.2011

можно так сгруппировать

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

Если у вас было 10 элементов, он создаст две группы по 5 в каждой.

person parapura rajkumar    schedule 16.11.2011

Извлеките свои данные как есть, поместите их в контейнер, затем разделите их.

Ваши запросы никогда, никогда не должны знать ничего о том, как данные, которые они извлекают, отображаются пользователю.

person Alex    schedule 16.11.2011