LINQ - Упорядочить по и различать по разным полям. Пропустить и принять разные значения - PullRequest
1 голос
/ 19 февраля 2020

Я пытаюсь ORDER BY некоторые поля, но SELECT DISTINCT другим полем, и после этого применить Skip & Take

Код:

var result = entities.OrderBy(e => e.OrderField)
                     .Select(e => e.SelectField)
                     .Distinct()
                     .Skip(skip)
                     .Take(take)
                     .ToArray();

Но я получаю это исключение:

System.NotSupportedException: «Метод« Пропустить »поддерживается только для отсортированного ввода в LINQ to Entities. Метод 'OrderBy' должен быть вызван перед методом 'Пропустить'. '

Я понимаю причину (набор изменяется между упорядочением и пропуском), но я могу обойти эту проблему без запрашивать базу данных более одного раза (редактировать: и не получать больше объектов, чем предполагалось)?

РЕДАКТИРОВАТЬ: Я не думаю, что есть оптимальное решение для этого, поэтому я сделал Я получил значения, а затем разбил их на страницы. * вздох *

var result = entities.OrderBy(e => e.OrderField)
                     .Select(e => e.SelectField)
                     .Distinct()
                     .ToArray()
                     .Skip(skip)
                     .Take(take)
                     .ToArray();

Ответы [ 3 ]

2 голосов
/ 19 февраля 2020

Вы должны добавить .OrderBy(e => e) перед Skip.

var result = entities.OrderBy(e => e.OrderField)
                 .Select(e => e.SelectField)
                 .Distinct()
                 .OrderBy(e => e)
                 .Skip(skip)
                 .Take(take)
                 .ToArray();

Прочитайте следующий пост, чтобы лучше понять

Метод «Пропустить» поддерживается только для отсортированный ввод в LINQ to Entities

1 голос
/ 19 февраля 2020

Редактировать: Обновлено на основе комментария. Следующий код должен работать в вашем случае:

var result = entities
            .OrderBy(e => e.OrderField)
            .Select(e => e.SelectField)
            .GroupBy(e => e)
            .Select(group => group.Key)
            .Skip(skip)
            .Take(take)
            .ToArray();
0 голосов
/ 19 февраля 2020

Вы можете взять из Distinct значений из базы данных и затем работать в памяти следующим образом:

var result = entities.OrderBy(e => e.OrderField)
                     .Select(e => e.SelectField)
                     .Distinct()
                     .ToArray()
                     .Skip(skip)
                     .Take(take)
                     .ToArray();

Вы будете запрашивать один раз, как хотели

...