2013-04-29 75 views
0

从我的问题按照先前here如何按属性1对IQueryable进行分组,但按属性2排序?

我用

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(); 
+0

你要排序的所有群体的,如果是这样,如果一个组中的项目并不都具有相同的' nLicenseID',你做什么?或者你的意思是按照每个组内的价值进行排序? – Servy 2013-04-29 17:24:30

+0

什么阻止你按顺序执行'lics.Id' - lambda? – 2013-04-29 17:27:18

+0

“如果一个组中的项目并不都具有相同的nLicenseID” - 是的,我知道这一点,我只是想知道这个 - >“你是指按每个组中的值排序?” – Mikk 2013-04-29 17:27:52

回答

0

对于LINQ到对象,对象每个组保留它们被发现的顺序:

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。

+0

他特别说这是'IQueryable',所以它不是*对象。这是LINQ到SQL(基于上一个问题) – Servy 2013-04-29 17:29:33

+1

@Servy'IQueryable'没有告诉我们任何有关来源。 LINQ-to-Objects可以暴露为'IQueryable'。奇怪的是,通过'.AsQueryable'。现在,“上一个问题” - 这很好,但我正在回答这个问题,而不是前一个问题。 – 2013-04-29 17:30:28

+0

正如我所说,根据此用户在这个问题上的前几个问题,它是LINQ到SQL,而不是LINQ到对象。即使你不知道,答案应该(理想情况下)适用于任何查询提供者,如果没有指定,而不只是一个特定的(而且不太可能)查询提供者。 – Servy 2013-04-29 17:31:27

0

在组内对项目进行排序,你可以使用Select

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