Linq orderby和distinct

时间:2014-10-03 15:14:24

标签: linq

我的表设置如下:

Section SectionOrder
Sect1     1 
Sect2     2 
Sect3     3 
Sect3     3 
Sect1     1
Sect2     2

我需要以正确的部分顺序提取不同的部分。这是我正在使用的linq,但由于某种原因它没有按正确的顺序排列。

var myVar = (from x in context.Documents 
             orderby x.SectionOrder ascending
             select x.Section).Distinct(); 

然后我希望能够遍历myVar并将每个项目放在一个列表中,如下所示:

foreach (var t in myVar)
        {
             listOfDocTypeSections.Add(t);
        }

1 个答案:

答案 0 :(得分:1)

OrderByDistinct的排序很重要:虽然OrderBy生成了有序序列,Distinct却没有。您需要先放置Distinct,然后使用OrderBy。但是,由于您对一个属性采用Distinct,并对另一个属性进行排序,因此您需要采用不同的方式:

var myVar = context
    .Documents
    .GroupBy(x => x => x.Section) // This replaces Distinct()
    .OrderBy(g => g.FirstOrDefault().SectionOrder) // There will be no default
    .Select(g => g.Key);

此方法将Distinct替换为GroupBy,并在组的第一个SectionOrder项目上进行排序。您可以更改此排序策略,以对Section中的其他项目进行排序,例如MinMax SectionOrder的值:

var myVar = context
    .Documents
    .GroupBy(x => x => x.Section)
    .OrderBy(g => g.Max(x => x.SectionOrder))
    .Select(g => g.Key);