2011-11-17 3 views
1

MVC3 및 EF 4.1 (Oracle DB)을 사용하고 있습니다. 내가 가지고 있다고 가정 해 봅시다 :오라클, Linq 및 정렬 어린이

Public Class Parent 
    Public Property Id As Integer 
    Public Property Name As String 
    Public Overridable Property Children As List(Of Child) 
End Class 

Public Class Child 
    Public Property Id As Integer 
    Public Property Name As String 
    Public Property Age As Integer 
End Class 

데이터베이스에서 모든 부모를 검색하고 각 부모에 대해 해당 하위에 액세스 할 수 있습니다.

나는 다음을 수행 할 :

Dim firstParent = (From q In db.Parents Select q).First() 

For Each child In firstParent.Children 
    'Do something 
Next 

문제는 내가 가장 오래된에 막내에서 아이들을 열거하고 싶은 것입니다. 클라이언트 측 정렬없이 가능합니까? 그렇다면 어떻게해야합니까? 나는 내가 SQL 쿼리로 원하는 것을 얻을 수있는 방법을 안다.하지만 LINQ와 함께 작동하도록 만들 수는 없다. ...

EDIT : 이것은 내 경우에는 솔루션을 갖고 있지 않기 때문에 데이터를 요청할 때마다 정렬된다. 옵션이 아닐 수도 있습니다. 데이터베이스에 데이터를 삽입 할 때 할 수있는 일이 있을까요? 나는 db.Save()를 호출 할 때 EF가 데이터베이스에 항목을 저장하는 컨트롤이 없지만 어쩌면 일부 속성을 기반으로 정렬을 요구할 수있는 구문이있을 수 있습니다. 어떤 아이디어?

답변

0

어떻게 NHibernate에를 사용한 경우

var children = db.Children.Where(c => c.ParentId == "foo").OrderBy(c => c.Age); 

사용자가 정의 할 수 있습니다 당신이 vb.net

+0

저는 원래 C# 프로그래머 였기 때문에 문제가 아닙니다. 문제는 실제 사례 시나리오에서 4 레벨이 있고 각 레벨에서 제대로 주문해야한다는 것입니다 ... –

0

이 점을 변환 할 수 있기를 바랍니다 다른 측면에서 접근에 대한 default order "를 사용하여 (아이 컬렉션을로드 할 때 order-by "속성). 당신은 아마 (예 : ParentRepository.GetOrderedChildren(Parent myParent) 같은) 특정 저장소 방법을 만들고 LINQ 조인을 사용하여 아이를로드 할 수 있도록, 엔티티 프레임 워크, there is no such mapping option을 사용하고 있기 때문에 (이 람다 구문입니다) :

context.Parents 
    .Join(context.Children, 
     p => p, 
     c => c.Parent, 
     (p, c) => new { Parent = p, Child = c } 
    ) 
    .Where(o => o.Parent == myParent) 
    .OrderBy(o => o.Child.myOrderField) 
    .Select(o => o.Child) 
    .ToList();  

있습니다 귀하의 코드는 Select N+1 problem으로 인해 어려움을 겪을 수 있습니다. 모든 부모를로드 한 다음 모든 부모에 대해 하위를로드하기 때문입니다. eager loading 일종의 일을하는 것이 좋습니다.