2015-11-23 2 views
0

У меня есть стол, который имеет три столбца: username, followerCount и CreateDate.LINQ & SQL Server: упорядочить по стартовой строке

В таблице около 110000 пользователей, и я пытаюсь показать пользователей, упорядоченных по followerCount. Я делаю так:

select top 50 * 
from Users 
where followerCount <= @followerCount 
order by followerCount desc, createDate desc 

Так второй странице я прохожу последний followerCount с первой страницы, и я получаю следующую страницу и так далее.

Но есть некоторые пользователи в таблице, что они имеют один и тот же счетчик. Например, 250 пользователей имеют 5000 подписчиков. Поэтому, когда я выполняю пейджинг, я не могу получить следующую страницу правильно, потому что есть больше пользователей с 5000 последователей.

Например, я нахожусь на странице 9, и у последнего пользователя есть 5001 последователей, я передаю 5001 в хранимую процедуру, и у меня есть 50 пользователей, у которых 5000 пользователей. Но есть еще 200 пользователей, и когда я передаю это время 5000 (последний номер из предыдущего пейджинга) снова в мою хранимую процедуру, он пропустит все остальное и приведёт меня к пользователям с последователями 4xxx.

Как я могу достичь, чтобы привести правильных пользователей, у которых одинаковое количество последователей?

Исправление: я использую Entity Framework для этой цели, я разместил SQL-инструкцию для удобного понимания.

+0

Единственный параметр @followerCount недостаточно для определения того, что вы хотите. Если вы используете EF6.1.2 + с SQL-сервером 2012, вы можете добавить SKIP и TAKE более эффективно с помощью 'OFFSET FETCH' https://technet.microsoft.com/en-us/library/gg699618(v=sql. 110) .aspx – Eric

ответ

0

Просто следить за того, что страница # вы находитесь, то вы можете использовать Пропустить и принять, чтобы сделать ваши подкачки для вас:

var page=9; //Set to whatever page you want 
var pageSize=50; 
var results=db.Users 
    .OrderByDescending(u=>u.followerCount) 
    .ThenByDescending(u=>u.createDate) 
    .Skip((page-1)*pageSize) 
    .Take(pageSize); 

Если вам нужно хранимая процедура, чтобы сделать подкачки для вас, то вам необходимо прочитать, как работает ROW_NUMBER OVER() для более старых версий SQL Server (до 2012 года) или OFFSET FETCH для более новых.

Смежные вопросы