Как сгруппировать IQueryable по свойству 1, но упорядочить по свойству 2?

Следуя моему вопросу ранее здесь

я использовал

var distinctAllEvaluationLicenses = allEvaluationLicenses.GroupBy((License => License.dateCreated)).OrderByDescending(lics => lics.Key).First();

Чтобы сгруппировать IQueryable

allEvaluationLicenses 

используя свойство License 1, которое называется «dateCreated»

Но теперь, как я могу упорядочить их, используя другое свойство, такое как «nLicenceID»?

Можно ли сделать что-то вроде этого:

var distinctAllEvaluationLicenses = allEvaluationLicenses.GroupBy((License => License.dateCreated)).OrderByDescending(lics => (sort by nLicenseID here) ).First();

person Mikk    schedule 29.04.2013    source источник
comment
Вы хотите отсортировать все группы, если да, то что делать, если элементы в группе не имеют одинакового nLicenseID ? Или вы имеете в виду сортировку по этому значению внутри каждой группы?   -  person Servy    schedule 29.04.2013
comment
Что мешает вам сделать lics.Id в порядке лямбды?   -  person Mohammed Hossain    schedule 29.04.2013
comment
что, если элементы в группе не все имеют одинаковый nLicenseID -- Да, я знаю об этом, я просто хочу это знать --> вы имеете в виду сортировку по этому значению в каждой группе?   -  person Mikk    schedule 29.04.2013


Ответы (2)


Для LINQ-to-Object объекты внутри каждой группы сохраняют порядок, в котором они были обнаружены:

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

Итак: если вы хотите упорядочить содержимое каждой группы, просто упорядочите исходный код:

var distinctAllEvaluationLicenses = allEvaluationLicenses
    .OrderByDescending({whatever})
    .GroupBy({etc}).First(); 

Обратите внимание, что это не гарантирует работу для других источников LINQ, и обратите внимание, что это не влияет на порядок, в котором представлены группы. Для этого вы могли бы сделать что-то вроде:

var distinctAllEvaluationLicenses = allEvaluationLicenses
    .GroupBy({etc}).
    .OrderBy(grp => grp.Min(item => x.SomeProp)).First(); 

который будет представлять группы в порядке минимума SomeProp в каждой. Очевидно, при необходимости отрегулируйте max / etc.

person Marc Gravell    schedule 29.04.2013
comment
Он специально сказал, что это IQueryable, поэтому он не связан с объектами. Это linq to sql (на основе предыдущего вопроса) - person Servy; 29.04.2013
comment
@Servy IQueryable ничего не говорит нам об источнике. LINQ-to-Objects могут быть представлены как IQueryable. Как ни странно, через .AsQueryable. Теперь немного предыдущего вопроса - это нормально, но я отвечаю на этот вопрос, а не на предыдущий. - person Marc Gravell; 29.04.2013
comment
Как я уже сказал, согласно предыдущим вопросам этого пользователя по этой проблеме, это linq to sql, а не linq для объектов. Даже если вы этого не знали, ответ должен (в идеале) относиться к любому поставщику запросов, если ни один не указан, а не только к одному конкретному (и довольно маловероятному) поставщику запросов. - person Servy; 29.04.2013

Для сортировки элементов внутри группы вы можете использовать Select:

var distinctAllEvaluationLicenses = allEvaluationLicenses.GroupBy(License => License.dateCreated)
    .Select(group => group.OrderByDescending(item => item.nLicenceID));
person Servy    schedule 29.04.2013