Групиране на Link to sql по брой записи

Има ли начин да се създаде linq към 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 към 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 няма нищо вградено, освен skip/take. Това за странирана таблица ли е? Просто се чудя защо трябва да вземете всички групи наведнъж. Обикновено първо преброявам и след това правя прескачане/заснемане, когато потребителят прелиства страниците.   -  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