如何按属性1对IQueryable进行分组,但按属性2进行排序?

时间:2013-04-29 17:22:46

标签: c# linq

以前的问题here

我用过

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

分组IQueryable

allEvaluationLicenses 

使用许可证的属性1,即'dateCreated'

但是现在,我如何通过使用'nLicenceID'等其他属性来订购它们?

是否可以做这样的事情:

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

2 个答案:

答案 0 :(得分:0)

对于LINQ-to-Objects,每个组中的 对象保留了发现它们的顺序:

  

根据生成每个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。

答案 1 :(得分:0)

要对组中的项目进行排序,您可以使用Select

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