【问题标题】:Linq orderby and distinctLinq orderby 和 distinct
【发布时间】:2014-10-03 23:28:56
【问题描述】:

我有一个表设置如下:

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);
        }

【问题讨论】:

    标签: linq


    【解决方案1】:

    OrderByDistinct 的顺序很重要: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);
    

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

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

    【讨论】:

    • 您的查询出现此错误:base {System.SystemException} = {"方法 'First' 只能用作最终查询操作。请考虑在而是这个实例。"}
    • @Jack28 这很奇怪。你也可以使用FirstOrDefault,因为那里总会有至少一项。
    • @Jack28 你也应该能够使用listOfDocTypeSections.AddRange(myVar) 而不是foreach 循环。
    • firstordefault() 起作用了!感谢您指出我可以使用 .AddRange - 我不知道。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 2020-06-10
    • 1970-01-01
    • 2017-05-19
    相关资源
    最近更新 更多