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