类的OrderBy IEnumerable属性



给定以下类,我想先按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}

任何关于如何解决这个问题的帮助将非常感激!

您需要将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);

根据您的编辑,我能想到的唯一方法是使用单个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表达式中可能有一种优雅的方式来写这个,不使用像那样显式的匿名函数,但我遇到了麻烦,所以我想它会很神秘

我建议您在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);

相关内容

  • 没有找到相关文章