4

다른 엔터티 목록이 포함 된 엔터티 목록을 정렬하려고합니다. 모든 엔터티에 대해 IComparable을 구현했지만 여전히 예외가 발생합니다. 필자가 보았던 모든 예는 하나의 목록이 있고 그 목록의 특정 필드로 주문하지만 목록의 목록이없는 곳에서는 문제를 해결합니다. 이 문제는 Linq에서 아래의 Object 및 Linq to Entities에서 발생합니다. 내가 뭘 놓치고 있니?Linq 하나 이상의 개체가 IComparable을 구현해야합니다.

[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); 
     } 
    } 
} 
+1

'IComparable' (그것은'CompareTo' 방법이있다하더라도. 그는이 은색 총알이었다 – EyasSH

+0

좋은 관찰 기대했다? 그것을 할 수 있지만, 나는 그것을 내가 추가 할 수 여전히이 줄은 혼란 같은 오류 – Shiloh

+0

를 얻을 :.'pplEnumerable = pplEnumerable.OrderByDescending (R => r.PersonHobbies.OrderByDescending (P => p.Hobby.Name));'당신은 기본적으로 목록으로 주문하는 – EyasSH

답변

4

기본적으로 목록에 순서를 적용 할 수 없습니다. 사용자 지정 클래스 (EquatableList 등)를 작성하거나 LINQ 제외 & 교차 연산자를 사용하여 목록을 비교해야합니다.

하지만 당신의 의견에 따라, 당신의 LINQ와 동등한를 찾고 있다면 :로 그

select * from Person p join PersonHobby ph 
on ph.PersonId = p.PersonId join Hobby h 
on h.HobbyId = ph.HobbyId order by h.Name 

이 달성 될 수있다 : 우리는 사람, 사람의 취미에 가입 기본적으로

var query = people.SelectMany(p => p.PersonHobbies) 
        .Join(hobbies, ph => ph.HobbyId, h => h.HobbyId, 
         (ph, h) => new 
         { 
         Person = ph.Person, PersonHobby = ph, Hobby = h 
         }) 
        .OrderBy(r => r.Hobby.Name); 

및 키에 취미를 설정하고 모든 열을 투영하고 SQL에 언급 된대로 hobby.name 필드로 정렬하십시오.

그것은`PersonHobby`이 구현되어처럼 보이지 않는
관련 문제