자체 참조 테이블을 위한 LINQ to SQL?
-
09-06-2019 - |
문제
자체 참조 카테고리 테이블이 있습니다.각 카테고리에는 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;
}