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-我不知道这一点。