문제

자체 참조 카테고리 테이블이 있습니다.각 카테고리에는 CategoryID, ParentCategoryID, CategoryName 등이 있습니다.그리고 각 범주에는 여러 개의 하위 범주가 있을 수 있으며, 각 하위 범주에는 여러 개의 하위 범주가 있을 수 있습니다.따라서 기본적으로 트리의 깊이는 X 수준이 될 수 있습니다.

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

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

도움이 되었습니까?

해결책

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

다른 팁

여기 LINQ를 사용하여 끔찍하게 급하게 구현한 내용이 있습니다.이것을 사용하지 마십시오 :-)

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

성능이 뛰어난 접근 방식은 모든 노드의 모든 조상에 대한 노드-상위 쌍을 포함하는 완전히 다른 테이블을 유지 관리하는 삽입/수정/삭제 트리거를 만드는 것입니다.이렇게 하면 조회는 O(N)입니다.

노드와 모든 하위 항목에 속하는 모든 제품을 가져오는 데 이를 사용하려면 대상 노드를 상위 노드로 포함하는 모든 카테고리 노드를 선택하면 됩니다.그런 다음 해당 카테고리에 속하는 제품을 선택하기만 하면 됩니다.

내가 이것을 처리하는 방법은 몇 가지 확장 방법(필터)을 사용하는 것입니다.나는 이것을 구현한 프로젝트에서 몇 가지 샘플 코드를 작성했습니다.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;
        }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top