문제

ID, CategoryName 및 ParentID가 포함 된 자체 참조 테이블이 있습니다. DB 전문가가 나에게 인접 모델이라고 말하는 범주로 나눌 수있는 계층 구조 테이블의 일반적인 시나리오입니다.

내가 원하는 것은 LINQ에서 SQL을 사용하여 다른 하위 범주와 관련이없는 하위 범주에 대한 쿼리를 사용하는 것입니다. 즉, 주어진 범주 또는 하위 범주의 즉각적인 리프 노드입니다.

쉬운 부분은 하위 범주를 얻는 것입니다. 코드를 여기에 넣는 것이 거의 당황했습니다. 하지만 우리는 코드를보고 싶어합니다 ..

IList<Categories> subcategories = context.Where( c => c.ParentId == 1).ToList();  

그러나 하위 카테고리가없는 카테고리로 좁히면 나를 돌리고 있습니다. 어떤 도움이든 큰 감사를드립니다.

도와 주셔서 감사합니다. 제프

업데이트 ** 이것은 이것이 작동하는 것처럼 보이지만 누군가가 "적절한"것을 확인할 수 있다면 감사 할 것입니다. 따라서 ID = 1이있는 범주에서 리프 노드를 원한다면 다음과 같습니다.

Categories.Where( c => !c.Children.Any ( d => d.ParentId == c.Id)).Where( e => e.ParentId == 1) 

"어린이"는 Linq가 자체 참조 협회를 제공하는 이름입니다.

도움이 되었습니까?

해결책

솔루션은 정확합니다 Any() 메소드, SQL "Exists () 함수로 변환되고 !c.Children.Any ( d => d.ParentId == c.Id)) 비슷한 SQL 조항으로 변환됩니다 NOT EXISTS (SELECT * FROM Categories WHERE ParentID = outerRef.ID)

그것을하는 또 다른 방법은 사용하는 것입니다 Count :

Categories.Where( c => c.Children.Count(d => d.ParentId == c.Id) == 0).Where( e => e.ParentId == 1)

그러나 일반적으로 존재하는 ()는 SQL에서 COUNT ()보다 선호되므로 (성능상의 이유로) ()가있는 솔루션이 올바른 솔루션이어야합니다.

다른 팁

당신의 질문을 올바르게 이해한다면 당신은 당신이 거기에 자녀가없는 모든 어린이 요소를 얻으려고 노력하고 있다고 생각합니다 ...이 쿼리 자체는 노드가 부모로 사용되는지 테이블 자체에 합류합니다. 그런 다음 결과에 표시되지 않습니다.

테스트 할 것이 없기 때문에 이것이 효과가 있는지 확실하지 않습니다 ...

   (from c in context
    join cc in context on c.id equals cc.parentid into temp
    from t in temp.DefaultIfEmpty()
    where t == null
    select c).ToList()
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top