【发布时间】:2014-04-26 06:34:43
【问题描述】:
我正在尝试订购包含另一个实体列表的实体列表。我已经为所有实体实现了 IComparable 并且仍然得到异常。我看到的所有示例都解决了您有一个列表并按该列表中的给定字段排序但没有列表列表的问题。这个问题发生在下面的 Linq to Objects 和 Linq to Entities 上。我错过了什么?
[TestClass]
public class OrderBy
{
[TestMethod]
public void OrderByTest()
{
var hobbies = new Collection<Hobby> { new Hobby { HobbyId = 1, Name = "Eating" }, new Hobby() { HobbyId = 2, Name = "Breathing" } };
var p1 = new Person
{
PersonId = 1,
Name = "A",
PersonHobbies = new Collection<PersonHobby> { new PersonHobby() { PersonHobbyId = 1}}
};
var p2 = new Person
{
PersonId = 2,
Name = "Z",
PersonHobbies = new Collection<PersonHobby> { new PersonHobby() { PersonHobbyId = 2 }}
};
var people = new List<Person> { p1, p2 };
var pplEnumerable = people.AsEnumerable();
pplEnumerable = pplEnumerable.OrderByDescending(r => r.PersonHobbies.OrderByDescending(p => p.Hobby.Name));
foreach (var person in pplEnumerable)
{
Console.WriteLine(person.Name);
}
}
public class Person : IComparable
{
public int PersonId { get; set; }
public string Name { get; set; }
public virtual ICollection<PersonHobby> PersonHobbies { get; set; }
public int CompareTo(object obj)
{
if (obj == null) return 1;
var otherPerson = obj as Person;
return PersonId.CompareTo(otherPerson.PersonId);
}
}
public class PersonHobby : IComparable
{
public int PersonHobbyId { get; set; }
public int HobbyId { get; set; }
public virtual Person Person{ get; set; }
public int PersonId { get; set; }
public virtual Hobby Hobby { get; set; }
public int CompareTo(object obj)
{
if (obj == null) return 1;
var otherPersonHobby = obj as PersonHobby;
return PersonHobbyId.CompareTo(otherPersonHobby.PersonHobbyId);
}
}
public class Hobby : IComparable
{
public int HobbyId { get; set; }
public string Name { get; set; }
public int CompareTo(object obj)
{
if (obj == null) return 1;
var otherHobby = obj as Hobby;
return HobbyId.CompareTo(otherHobby.HobbyId);
}
}
}
【问题讨论】:
-
它看起来不像
PersonHobby正在实现IComparable(即使它有一个CompareTo方法。可能是这样吗? -
很好的观察,希望这是灵丹妙药,但我添加了它,我仍然得到同样的错误
-
这一行令人困惑:
pplEnumerable = pplEnumerable.OrderByDescending(r => r.PersonHobbies.OrderByDescending(p => p.Hobby.Name));你基本上是按列表排序的。 -
您正试图按个人爱好的集合来订购他们的集合。您可以尝试只比较每个人的一个爱好(例如
First、Min、Max等),或者从爱好集合中投影一个标量,例如哈希的计数或总和等。 -
我试过 FirstOrDefault() 但实际上并没有按字段值排序。这是获得我正在寻找的结果的非常简单的 sql select * from Person p join PersonHobby ph on ph.PersonId = p.PersonId join Hobby h on h.HobbyId = ph.HobbyId order by h.Name
标签: c# linq entity-framework linq-to-entities linq-to-objects