почему Linq GroupBy после OrderBy отклонил операцию заказа? - PullRequest
4 голосов
/ 27 декабря 2011

У меня есть Действие модель с Сеанс Свойство навигации,

Рассмотрим этот код:

var x=db.Actions.OrderBy(p => p.Session.Number).ThenBy(p => p.Date);//it's OK

x является упорядоченным действием, но при группировании по x группа не выполняет итерацию по x (на основе Action.Session ) вручную для упорядоченного перечисляемого:

var y=x.GroupBy(p=>p.Session).ToArray()

у вас есть группа (Key, IGrouping) сессий, но почему group.Key не упорядочен основано на Session.Number ?

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

Ответы [ 4 ]

3 голосов
/ 27 декабря 2011

Потому что это Enumerable.GroupBy, который сохраняет порядок. Для Queryable.GroupBy такое обещание не дается. Из документации бывшей:

Объекты IGrouping (Of ​​TKey, TElement) выдаются в порядке, основанном на порядок элементов в источнике, который произвел первый ключ каждого IGrouping (TKey, TElement). Элементы в группировке выдаются в порядке они появляются в источнике.

Вы звоните последнему, и выше не упоминается. Позвоните OrderBy после GroupBy, чтобы все заработало.

Обновление : поскольку вы, очевидно, хотите сортировать не только по ключу GroupBy, вы должны иметь возможность использовать другую перегрузку GroupBy, чтобы указать, что список действий каждого сеанса должен быть отсортирован:

db.Actions.GroupBy(
    p => p.Session,
    (session, actions) => new {
        Session = session,
        Actions = actions.OrderBy(p => p.Date)
    }).OrderBy(p => p.Session.Number).ToArray();
2 голосов
/ 27 декабря 2011

Поскольку не определено, что GroupBy сохраняет либо порядок вставки, либо базовый порядок ключей (так же, как Dictionay<,> не дает такой гарантии для локальной работы в памяти).Просто порядок после группировки, вместо этого:

var y = db.Actions.GroupBy(p=>p.Session).OrderBy(grp => grp.Key).ToArray();

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

0 голосов
/ 27 декабря 2011

Спасибо @Marc Gravell & @hvd за примечание о групповой IGrouping (Of ​​TKey, TElement) не сохраняет порядок TKey, но сохраняет порядок TElement.

Итак, мой ответ на мой последний вопрос (Как я достиг группы заказа сеанса по номеру и каждой группы, упорядоченной по дате?) :

var x= db.Actions
.OrderBy(p => p.ActionDateTime)
.GroupBy(p => p.Session)
.OrderBy(q => q.Key.Number)
.ToArray();
0 голосов
/ 27 декабря 2011

Только имя GroupBy предполагает, что данные, запрашиваемые в этот момент, будут сгруппированы, агрегированы (назовите как хотите) в другой блок данных на основе предоставленного параметра.

Обычно, если вы хотите увидеть результат sorted, вызов функции Sort() должен быть последним в последовательности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...