2014-01-09 2 views
0

예를 들어 this을 기반으로, 상위 레코드 속성에 정렬을 적용 할 수 있습니다. 그러나 나는 자식 레코드에 정렬을 적용 할 수 없다. 다음 결과 집합에 적용되는하위 속성에 대한 Linq 동적 정렬

Func<Company, string> orderingFunction = (c => sortColumnIndex == 1 ? c.Name : 
               sortColumnIndex == 2 ? c.Address : 
               c.Town); 

: : 이제

results = results.OrderBy(orderingFunction) 

이 회사는 자식 레코드를 가지고 말할 예에서

, 대리인은 회사의 특성에 순서를 설정하는 생성된다 , 같은 기술을 사용하여 하위 속성을 정렬하려면 어떻게해야합니까?

나는이 같은 시도 :

Func<ChildObject, string> orderingFunction = (c => c.ChildRecords.FirstOrDefault().SomeProperty); 

을하고 난 결과 집합에 직접 정렬을 적용하려고 :

results = results.OrderBy(x => x.ChildRecords.OrderBy(c => c.SomeProperty)) 

이러한 방식의 작업 둘을.

+0

첫 번째 접근 방식은 각 회사의 첫 번째 ChildRecord에서 SomeProperty 값으로 정렬됩니다. 그 접근법에 만족하지 못한 것은 무엇입니까? –

+0

@SteveRuble - 회사가 하나의 하위 레코드 만 갖고 있지만 정렬해야하는 하위 레코드가 여러 개있는 경우에는 괜찮습니다. 그리고 말한 것처럼이 접근법을 사용하여 첫 번째 ChildRecord 만 정렬됩니다. – markpsmith

답변

1

첫째, 그것은 단지 하나 개의 자식 기록을 가지고 있기 때문에이 코드가 작동하지 않는

Func<ChildObject, string> orderingFunction = (c => c.ChildRecords.FirstOrDefault().SomeProperty); 

를 작동하지 않는 이유에 이유. 당신이 아이의 기록 bythe 순서에 상관없이이, 그것은 항상 X 기준에 따라 기본적으로 다시 주문해야하기 때문

results = results.OrderBy(x => x.ChildRecords.OrderBy(c => 
     c.SomeProperty)) 

가 작동하지 않습니다.

그럼 어떻게 만드나요? 회사 목록을 주문하려면 논리 주문을 주문 기능에 넣기 만하면됩니다. 이 같은.

results = results.OrderBy(Function(m) 
    If "Check custom logic to determine the order" Then 
     Return 2 
    Else 
     Return 1 
    End If 
End Function) 

은 VB.NET 언어에 있습니다. 이것에 대한 사과. 나는 C#의 문법에 대해 확신하지 못한다. 그러나 그 아이디어는 대략 같다. 샘플 케이스에 대한

, 클래스의 구조는 다음과 같습니다 :

  Parent p1 = new Parent 
      { 
       Name = "Test1", 
       Index = "1", 
       Children = new List<Child> { 
        new Child {Name = "Child1", Index = "3"}, 
        new Child {Name = "Child2", Index = "2"}, 
        new Child {Name = "Child3", Index = "1"} 
       } 
      }; 

      Parent p2 = new Parent 
      { 
       Name = "Test2", 
       Index = "2", 
       Children = new List<Child> { 
        new Child {Name = "Child4", Index = "6"}, 
        new Child {Name = "Child5", Index = "5"}, 
        new Child {Name = "Child6", Index = "4"} 
       } 
      }; 

      List<Parent> listParent = new List<Parent>(); 
      listParent.Add(p1); 
      listParent.Add(p2); 

그래서, 당신이 달성하고자하는 것은 선택 하위 속성을 분류하는 것입니다?

나는 이렇게 추측합니까? 이것은 아동에 따라 주문할 수 있습니다.

listParent.ForEach(x => { 
    x.Children = x.Children.OrderBy(y => y.Index).ToList(); 
}); 
listParent.ToList<Parent>().ForEach(x => x.Children.ToList<Child>().ForEach(y => Console.WriteLine(y.Name))); 
+0

왜 작동하지 않는지에 대해 설명해 주셔서 감사합니다.하지만 정렬 가능한 하위 속성을 선택하기위한 Linq 구문에 문제가 있습니다. – markpsmith

+0

해명 해 주셔서 감사합니다. 제발 위의 내 의견을 참조하십시오. 따라서 원하는 하위 속성을 정렬하면됩니다. – Hatjhie

+0

맞습니다. 하위 속성을 정렬해야합니다. 저는 여러분의 모범을 보았습니다. 거의 작동합니다 - 그것은 자식 속성에 따라 정렬되지만 부모에 의해 그룹화됩니다. 상위 그룹화가없는 하위 속성별로 정렬하고 싶습니다. – markpsmith

관련 문제