불행히도, Entity Framework에는 기본적으로 없습니다. 자신 만의 솔루션을 구축해야합니다. 아마 당신은 루트까지 반복 할 필요가있을 것입니다. 당신은 (여기 : 3)이 방법으로 부모의 정적으로 고정 된 수의 제한됩니다
...
select new { x.Customer, x.Parent.Customer, x.Parent.Parent.Customer }
:하지만 것이 같이 이동 한 부모의 특정 번호를 얻기 위해 EF를 요청하여이 알고리즘을 최적화 할 수 있습니다 데이터베이스 왕복 2/3을 절약 할 수 있습니다.
편집 : 데이터 모델을 제대로 이해하지 못했지만 생각이 분명하기를 바랍니다. 나는이 같은 접근 방식을 적응 의견과 편집에 대응 :
편집 2
var rootOrg = ...;
var orgLevels = new [] {
select o from db.Orgs where o == rootOrg, //level 0
select o from db.Orgs where o.ParentOrg == rootOrg, //level 1
select o from db.Orgs where o.ParentOrg.ParentOrg == rootOrg, //level 2
select o from db.Orgs where o.ParentOrg.ParentOrg.ParentOrg == rootOrg, //level 3
};
var setOfAllOrgsInSubtree = orgLevels.Aggregate((a, b) => a.Union(b)); //query for all org levels
var customers = from c in db.Customers where setOfAllOrgsInSubtree.Contains(c.Org) select c;
공지 사항이 한정된 최대 트리 깊이에 대한이 유일한 작품. 실제로 이것은 보통 (10 또는 20) 경우입니다.
성능은 좋지 않지만 LINQ-to-Entities 전용 솔루션입니다.
출처
2012-05-20 09:11:47
usr
:
지금이 같은 쿼리를 사용할 수 있습니다 : 이것은 당신의 컨텍스트 (반환 값은 원래 Parent_OrganizationId가 INT NULL로 선언되어 있기 때문에 널 (NULL) INT 있습니다)에 방법 결과 너는 내 요점을 놓쳤다. 내 예제 모델에서 하나의 객체의 이름을 변경하여 명확하게합니다. 한 조직이 나무 조직의 근원 인 경우 그 조직의 이드와 나무 아래에있는 모든 조직의 이드를 가져와야합니다. – ProfK
일부 코드를 추가했습니다. – usr