2008-09-04 3 views
5

나는 자기 참조 범주 테이블이 있습니다. 각 카테고리에는 CategoryID, ParentCategoryID, CategoryName 등이 있습니다. 각 카테고리에는 원하는 수의 하위 카테고리가있을 수 있으며 각 하위 카테고리에는 원하는 수의 하위 카테고리가있을 수 있습니다. 그래서 기본적으로 트리는 X 레벨만큼 깊을 수 있습니다.자체 참조 테이블 용 LINQ to SQL?

그런 다음 제품은 리프 (하위) 카테고리에 연결됩니다. LINQ to SQL을 사용하여 주어진 카테고리 (모든 리프 자손과 관련된 모든 제품)에 대해 모든 제품을 가져 오는 방법이 있습니까?

이것은 재귀적인 문제처럼 느껴집니다. 대신 저장 프로 시저를 사용하는 것이 더 좋습니까?

답변

3

linq-to-sql이이 문제에 대한 좋은 대답이라고 생각하지 않습니다. SQL Server 2005를 사용하고 있으므로 CTE를 사용하여 계층 적 쿼리를 수행 할 수 있습니다. 저장 프로 시저 또는 인라인 쿼리 (DataContext.ExecuteQuery 사용)는 트릭을 수행합니다.

1

여기 LINQ를 사용하여 끔찍한 구현이 이루어졌습니다. 이 :-)

public IQueryable GetCategories(Category parent) 
{ 
    var cats = (parent.Categories); 
    foreach (Category c in cats) 
    { 
     cats = cats .Concat(GetCategories(c)); 
    } 
    return a; 
} 
1

성능이 좋은 방법은/삽입을 생성, 수정/모든 노드의 모든 조상 노드 조상 쌍을 포함하는 완전히 다른 테이블을 유지 트리거를 삭제하는 것입니다을 사용하지 마십시오. 이렇게하면 조회는 O (N)입니다.

노드 및 모든 하위 노드에 속한 모든 제품을 가져 오는 데 사용하려면 대상 노드가 상위 노드 인 모든 범주 노드를 선택할 수 있습니다. 그런 다음이 카테고리에 속하는 제품을 선택하기 만하면됩니다.

1

내가 처리하는 방법은 일부 확장 방법 (필터)을 사용하는 것입니다. 나는 이것을 구현 한 프로젝트의 샘플 코드를 작성했다. ParentPartner 객체 및 SubPartners 목록을 채우는 선을 구체적으로 살펴보십시오.

public IQueryable<Partner> GetPartners() 
     { 
      return from p in db.Partners 
        select new Partner 
        { 
         PartnerId = p.PartnerId, 
         CompanyName = p.CompanyName, 
         Address1 = p.Address1, 
         Address2 = p.Address2, 
         Website = p.Website, 
         City = p.City, 
         State = p.State, 
         County = p.County, 
         Country = p.Country, 
         Zip = p.Zip, 
         ParentPartner = GetPartners().WithPartnerId(p.ParentPartnerId).ToList().SingleOrDefault(), 
         SubPartners = GetPartners().WithParentPartnerId(p.PartnerId).ToList() 
        }; 
     } 


public static IQueryable<Partner> WithPartnerId(this IQueryable<Partner> qry, int? partnerId) 
     { 
      return from t in qry 
        where t.PartnerId == partnerId 
        select t; 
     } 

public static IQueryable<Partner> WithParentPartnerId(this IQueryable<Partner> qry, int? parentPartnerId) 
     { 
      return from p in qry 
        where p.ParentPartner.PartnerId == parentPartnerId 
        select p; 
     } 
+0

이것은 좋은 생각이라고 생각하지만 구현하려고하면 오류가 발생합니다. "WithPartnerId"확장 메서드에는 SQL에 대한 지원되는 변환이 없다고합니다. 어떤 아이디어? –