2015-02-26 3 views
3

Я написал два разных запроса, первый из которых должен получить первые 5 объектов, а затем следующий должен получить следующие 5 объектов, заказанных приобретенным стоимость. Проблема в том, что два значения в середине одинаковы, и когда я беру первые пять объектов, а затем пропускаю первые пять объектов и беру следующие пять объектов, последний объект первого набора совпадает с первым значением второй набор и объект с тем же купленным значением, что и этот объект, никогда не отображаются. Мои запросы ниже.Take() принимает разные значения, чем Skip() skips

var query = (from v in db.VideoGames 
      where v.gamesystem == "PC" 
      orderby v.purchased descending 
      select v).Take(5); 

var query2 = (from v in db.VideoGames 
      where v.gamesystem == "PC" 
      orderby v.purchased descending 
      select v).Skip(5).Take(5); 

Я хотел бы знать, есть ли что-то, что я могу сделать по-другому, чтобы это не происходило.

Редактировать: Я чувствую, что мое объяснение может быть немного запутанным, поэтому я собираюсь добавить пример, содержащий 10 объектов VideoGame в базе данных и там купленное значение.

  • VideoGame1.purchased = 1,
  • VideoGame2.purchased = 2,
  • VideoGame3.purchased = 3,
  • VideoGame4.purchased = 4,
  • VideoGame5.purchased = 5,
  • VideoGame6.purchased = 5,
  • VideoGame7.purchased = 7,
  • VideoGame8.purchased = 8,
  • VideoGame9.purchased = 9,
  • VideoGame10.purchased = 10

Вот что я получаю

query: VideoGame10, VideoGame9, VideoGame8, VideoGame7, VideoGame5

query2: VideoGame5, VideoGame4, VideoGame3, VideoGame2, VideoGame1

Вот что я хочу

query: VideoGame10, VideoGame9, VideoGame8, VideoGame7, VideoGame6

query2: VideoGame5, VideoGame4, VideoGame3, VideoGame2, VideoGame1

Я не волнует, если я получаю VideoGame5 в первом запросе, только до тех пор, поскольку я получаю как объект VideoGame5, так и объект VideoGame6.

+0

Ваш код верный, это, вероятно, код 18. https://ideone.com/fF1GL4 –

+1

@MatthewHaugen Нет, это не так. Дело в том, что если у вас есть элемент, указанный дважды, и вы сортируете и разбиваете страницу на этот дубликат в сортировке, чтобы убедиться, что один элемент всегда остается на одной стороне перерыва, а один элемент остается на другой стороне разрыва , –

+0

Не опечатка и Скотт выложили решение. – jma

ответ

7

объект с тем же значением, как купленного этот объект никогда не показывается

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

class Videogames 
{ 
    public string Name { get; set; } 
    public int purchased { get; set; } 
    public string gamesystem { get; set; } 

    public Videogames(string name, int purchased) 
    { 
     Name = name; 
     this.purchased = purchased; 
     gamesystem = "PC"; 
    } 
} 

static void Main(string[] args) 
{ 
    var VideoGames = new List<Videogames>(); 
    VideoGames.Add(new Videogames("A", 1)); 
    VideoGames.Add(new Videogames("B", 2)); 
    VideoGames.Add(new Videogames("C", 2)); 
    VideoGames.Add(new Videogames("D", 3)); 

    var query = (from v in VideoGames 
       where v.gamesystem == "PC" 
       orderby v.purchased descending 
       select v).Take(2); 

    var query2 = (from v in VideoGames 
        where v.gamesystem == "PC" 
        orderby v.purchased descending 
        select v).Skip(2).Take(2); 
} 

Вы получаете результаты, как A, B и B, D ...

Проблема в том, что у вас нет детерминированной сортировки, если есть связь, то какая бы базовая система не выполняла orderby (вероятно, SQL-сервер, а это EF или аналогичный).

Чтобы исправить это, вы должны сделать свою систему сортировки более конкретной, чтобы не было двусмысленных связей для механизма сортировки, чтобы решить для вас.

Изменение ваших queires в

var query = (from v in VideoGames 
      where v.gamesystem == "PC" 
      orderby v.purchased descending, v.Name ascending 
      select v).Take(2); 

var query2 = (from v in VideoGames 
       where v.gamesystem == "PC" 
       orderby v.purchased descending, v.Name ascending 
       select v).Skip(2).Take(2); 

бы это исправить. Вы не показывали свою модель, поэтому мне пришлось составлять поле Name. В ситуациях с базой данных у вас обычно есть какой-то первичный ключ ID, просто сделайте ваши запросы сортировкой по первичному ключу в качестве последнего параметра сортировки, и все должно быть в порядке.

+0

Спасибо за ответ. Вы, должно быть, написали это, когда я писал свое редактирование, чтобы лучше объяснить вопрос. – jma

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