我的表设置如下:
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);
}
答案 0 :(得分:1)
OrderBy
和Distinct
的排序很重要:虽然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
中的其他项目进行排序,例如Min
或Max
SectionOrder
的值:
var myVar = context
.Documents
.GroupBy(x => x => x.Section)
.OrderBy(g => g.Max(x => x.SectionOrder))
.Select(g => g.Key);