Linq Au moins un objet doit implémenter IComparable

Je vais essayer de commander une Liste d'Entités qui contient une liste d'Entités. J'ai mis en œuvre IComparable pour toutes les entités et toujours l'exception. Tous les exemples que j'ai vu l'adresse de la question où vous en avez une liste et vous commande d'un champ donné dans cette liste, mais pas où vous avez une liste de listes. Ce problème se pose pour Linq to Objects par ci-dessous et aussi pour Linq to entities. Ce qui me manque?

[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);
}
}
}
Il ne ressemble pas à PersonHobby est la mise en œuvre de IComparable (même si elle a un CompareTo méthode. Pourrait-ce être?
Bonne observation, a été en espérant que c'était la solution miracle mais je l'ai ajouté et j'obtiens toujours la même erreur
Cette ligne est source de confusion: pplEnumerable = pplEnumerable.OrderByDescending(r => r.PersonHobbies.OrderByDescending(p => p.Hobby.Name)); Vous sont fondamentalement de la commande par listes.
Vous essayez de commander une collection de personnes par leurs collections de passe-temps. Vous pouvez essayer de comparer juste un hobby de chaque personne (par exemple, la First, Min, Max etc), ou encore le projet d'un scalaire à partir d'une collection de passe-temps, par exemple, un nombre ou une somme de hachages etc.
J'ai essayé FirstOrDefault() mais cela ne fait pas de l'ordre par la valeur du champ. Voici le très facile sql pour obtenir le résultat que je suis à la recherche pour les select * from Personne p rejoindre PersonHobby ph sur le ph.PersonId = p.PersonId rejoindre Hobby h sur h.HobbyId = ph.HobbyId commande par h.Nom

OriginalL'auteur Shiloh | 2014-04-26