2009-03-13 3 views
0

실례로 문제를 보려면 www.apoads.com을 방문하여 "Local Businesses"메뉴 항목 위로 마우스를 가져갑니다. DB 호출에서 생성 된 일련의 중첩되지 않은 목록입니다. "Local Businesses"아래에있는 몇 가지 항목을 클릭하면 대부분의 범주가 비어있는 것을 볼 수 있습니다 (사이트는 매우 새 것입니다).LINQ 비어 있지 않은 중첩 메뉴를 생성 할 쿼리?

문제점 : 로컬 비즈니스가 실제로 포함 된 카테고리 만 표시하고자합니다. 나는 무엇을 시도했다

int BizCatID - PK,Identity (used in FK relation to the table named Biz) 
int? ParentID - BizCatID of this rows parentID, null means no parent 
nvarchar Name - name of the category 
nvarchar Caption - quick description of the category 

: 내가 지금처럼 내 LINQ 쿼리를 업데이트하려고했습니다 : 여기 내 카테고리 스키마의 모습입니다

분명히 작동하지 않습니다
from c in db.BizCategories where c.ParentID != null && c.Bizs.Count() > 0 select c; 

, 왜냐하면 하위 카테고리에 비즈니스가 포함되어 있는지 보여주기 위해 상위 카테고리가 필요하기 때문입니다. 부모 범주는 그 아래에 어떤 사업을하지 않아도되므로

from c in db.BizCategories where c.Bizs.Count() > 0 select c; 

이이 중 하나가 작동하지 않습니다 그래서 나는이 시도했다. 그래서 나는 일종의 역 재귀를 할 필요가있을 것 같은데, 어떻게 할 지 모르겠다.

아니면 아마도 나 자신을 위해 힘든 일을하고 있으며 db 스키마를 변경해야합니까?

답변

0

그렇게

public class BusinessCat 
{ 
    public string Name{get;set;} 
    public string Caption{get;set;} 
    public List<'dunno datatype'> Children{get;set;}; 
} 

var results = from c in BizCategories 
    where c.ParentID == null 
     select new BusinessCat{ 
      Name = c.Name, 
      Caption = c.Caption, 
      Children = (from d in BizCategories 
        where d.ParentID == c.BizCatID && d.Bizs.Count() > 0 select d).ToList() 
     } 

처럼 정보를 보유하는 클래스를 만들고이 당신은 아이들의 전체 목록을 가지고 당신은 단순히 foreach 문으로 반복 할 수 있습니다.

또한 나를 ... 생각 떨어져 LINQPad을 fireup하고 ... 감사를 일부 쿼리를 실행하는 데있어

where d.ParentID == c.BizCatID && d.Bizs.Count() 
+0

이미 LINQ에서 Sql까지의 클래스입니다. 부분 클래스 추가를 통해 Children 속성을 추가 할 수 있다고 가정합니다. 귀하의 솔루션은 실용적으로 보입니다. 어떻게 작동하는지보고 해 드리겠습니다. 고맙습니다! – Chaddeus

+0

그걸 바친 후에 네 말이 맞아. 나는 WAAAAY over-thinking things였습니다. 너무 간단해서 빨리 보았어 야합니다. 고맙습니다! – Chaddeus

0

재귀 비트는 확실하지 않지만 시작될 수 있습니다. 2 단계 쿼리입니다. 원하는 수준을 지원하고 싶습니다.

var allcats = (from c in db. BizCategories 
       select c).ToList(); // This will retrieve them all from the database. 

var twoLevels = from c in allcats 
       where c.ParentID == null 
       select new { 
          Name = c.Name, Caption = c.Caption, 
          Children = 
          from d in allcats 
          where d.ParentID == c.BizCatID 
          select d 
          }; 
+0

에 대한 .Join() 확장 방법을 수행 할 수 있습니다! – Chaddeus

0

이 같은 쿼리는 내가 필요에 가까운지고 :

from c in BizCategories 
    where c.ParentID == null 
     select new { 
      Name = c.Name, Caption = c.Caption, 
      Children = 
      from d in BizCategories 
      where d.ParentID == c.BizCatID && d.Bizs.Count() > 0 
      select d 
     } 

내가 할 실행 결과를 통해 다른 LINQ 쿼리와 내가 필요 정확히 뽑아해야한다. 지금은 그것을 테스트 할 수있는 컴퓨터가 아니라 가능한 한 한 번 대답 할 것입니다. 감사!

관련 문제