OrderBy类的IEnumerable属性

时间:2014-03-27 22:07:47

标签: c# .net linq

鉴于以下类,我想首先按FirstName属性排序列表,然后按PetNames属性排序:

private class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string DateOfBirth { get; set; }
    public IEnumerable<string> PetNames { get; set; }
}

仅通过FirstName对列表进行排序就可以了:

//...snip...//

people.OrderBy(a => a.FirstName);

//...snip...//

但我也很难根据PetNames属性对列表进行排序:

people.OrderBy(a => a.FirstName)
      .ThenBy(a => a.PetNames);

这会导致异常:

  

EntityCommandCompilationException未被用户代码

处理

编辑:

我想要解释的是,我试图首先对列表中的FirstName属性进行排序,然后对PetNames属性中的值列表进行排序。例如:

FirstName---LastName---PetNames
Jim---------Jones------{Rex, Fido}
Bob---------Smith------{Pluto, Goofy}

排序后,会变成:

FirstName---LastName---PetNames
Bob---------Smith------{Goofy, Pluto}
Jim---------Jones------{Fido, Rex}

非常感谢任何有关如何解决此问题的帮助!

3 个答案:

答案 0 :(得分:2)

您需要将PetNames转换为Linq-to-Entities可以比较的值。也许是这样的:

people.OrderBy(a => a.FirstName)
    .ThenBy(a => String.Join("", a.PetNames.ToArray()));

<强>更新 根据你的问题澄清:

people.Select(p => new Person()
{
    FirstName = p.FirstName,
    LastName = p.LastName,
    DateOfBirth = p.DateOfBirth,
    PetNames = p.PetNames.OrderBy(n => n)
})
.OrderBy(a => a.FirstName);

答案 1 :(得分:0)

我建议你在Person类的属性的get(或可以设置)部分进行PetNames排序操作;

public class Person
{

    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string DateOfBirth { get; set; }

    // Do the sort order of the pet names while you get the value
    IEnumerable<string> petNames = new HashSet<string>();
    public IEnumerable<string> PetNames
    {
        get { return petNames.OrderBy(p => p); }
        set { petNames = value; } // Or sorting could be done in set as well
    }
}

然后再次;

people.OrderBy(a => a.FirstName);

答案 2 :(得分:0)

根据你的编辑,我可以想到用一个lambda表达式来做这个的唯一方法(而不仅仅是首先使用简单的foreach作为宠物名称)是这样做的:

people.Select(p => { p.PetNames = p.PetNames.OrderBy(o => o); return p; })
      .OrderBy(p => p.FirstName);

但我真的没有看到刚刚做错的事情:

foreach(var person in people)
{
    person.PetNames = person.PetNames.OrderBy(o => o);
}

var sorted = people.OrderBy(p => p.FirstName);

我确定在一个lambda表达式中可能有一种优雅的方式来编写这个并没有使用像这样的显式匿名函数,但是我很难想出它,所以我想象一下它会非常神秘。