Linq orderby和distinct

Linq orderby和distinct,linq,Linq,我的桌子布置如下: Section SectionOrder Sect1 1 Sect2 2 Sect3 3 Sect3 3 Sect1 1 Sect2 2 foreach (var t in myVar) { listOfDocTypeSections.Add(t); } 我需要以正确的节顺序拉出不同的节。这是我正在使用的linq,但由于某些原因,它没有将它们按正确的顺序排列

我的桌子布置如下:

Section SectionOrder
Sect1     1 
Sect2     2 
Sect3     3 
Sect3     3 
Sect1     1
Sect2     2
foreach (var t in myVar)
        {
             listOfDocTypeSections.Add(t);
        }
我需要以正确的节顺序拉出不同的节。这是我正在使用的linq,但由于某些原因,它没有将它们按正确的顺序排列

var myVar = (from x in context.Documents 
             orderby x.SectionOrder ascending
             select x.Section).Distinct(); 
然后,我希望能够循环使用myVar,并将每个项目放入一个列表中,如下所示:

Section SectionOrder
Sect1     1 
Sect2     2 
Sect3     3 
Sect3     3 
Sect1     1
Sect2     2
foreach (var t in myVar)
        {
             listOfDocTypeSections.Add(t);
        }

OrderBy
Distinct
的排序很重要:虽然
OrderBy
生成了一个有序的序列,但
Distinct
却没有。您需要先将
设置为Distinct
,然后使用
OrderBy
。但是,由于您在一个属性上使用了
Distinct
,而在另一个属性上使用了order,因此您需要以不同的方式进行操作:

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);
这种方法用
GroupBy
替换
Distinct
,并在组的第一个
SectionOrder
项目上下单。您可以将此排序策略更改为对
部分
中的其他项目进行排序,例如
部分顺序的
最小值
最大值
值:

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

我用你的查询得到这个错误:Base{Stase.StaseExtRe}}= {方法“第一”只能用作最终的查询操作。在这个实例中考虑使用方法“FrestSturreDebug”。“} @ JAC28这很奇怪。您也可以使用
FirstOrDefault
,因为那里总是至少有一个项目。@JAck28您还应该能够执行
listOfDocTypeSections.AddRange(myVar)
而不是
foreach
循环。FirstOrDefault()工作了!感谢您指出我可以使用.AddRange-我不知道这一点。