2011-03-30 4 views
0

여기에서 조건이있는 테이블 메뉴에서 레코드를 가져 오는 LINQ 쿼리는 parentID == 0 (루트 메뉴 가져 오기)이고 !테이블에 쿼리 레코드를 쓰려면 어떻게해야합니까? parentID == 0 및 ID! = (parentID)

List<Menu> menus = MenuDAO.Instance.GetAll(); // Get All Record in Menu Table 
var parentID = (from p in menus where p.ParentID != 0 select new {p.ParentID}).Distinct(); // Get unique ParentID in Menu Table 
     List<int> numParentID = new List<int>(); 
     foreach (var a in parentID) 
     { 
      numParentID.Add(a.ParentID); 
     } // assign to a list <int> 
     this.ddlMenu.DataSource = from m1 in menus 
            where !(numParentID).Contains((int)m1.ID) && m1.ParentID == 0 
            select new { m1.ID, m1.Name }; 
     this.ddlMenu.Databind(); 

: ID = (parentID 목록), 난 그냥 모든 기록을로드 할 (부모 ID 목록입니다 아이를 메뉴 레코드의 ID입니다)가 아이의 기록과 아이들 기록이없는 루트 메뉴를 포함 그리고 나는이 코드를 실행합니다. 자식이없는 레코드를 표시하고 자식 레코드를 표시하지 않습니다. 누군가 그것을 고쳐 주도록 도와주세요. LINQ에서 새로 추가되었습니다.

결과는 다음과 같습니다. 자식이없는 레코드 목록, 내 메뉴 테이블 스키마는 ID, 이름, 주문, ParentID입니다.

답변

1

제안

1 - 당신은 당신이 항상

var parentIDs = (from p in menus 
       where p.ParentID != 0 
       select p.ParentID).Distinct(); 

복수 (parentIDs)

같은 이름의 컬렉션에 좋은 방법으로 쓸 수, 첫 번째 선택에서 익명의 객체를 선택할 필요가 없습니다 당신이 한 쿼리에서 그들 모두를 쓸 수 있도록

2 없음은 new List<>을 만들 반복 할 필요가

List<int> numParentIDs = (from p in menus 
          where p.ParentID != 0 
          select p.ParentID).Distinct().ToList(); 

답 : 먼저 모든 리프 레벨 하위 ID를 선택하십시오. ParentID 열의 값을 제외한 모든 ID를 가져옵니다. 그리고 나서 leafID에 합류하여 메뉴에서 선택하십시오.

var leafMenuIDs = menus 
        .Select(m => m.ID) 
        .Except(menus.Select(m => m.ParentID).Distinct())           
        .Distinct(); 


this.ddlMenu.DataSource = from m in menus 
          join id in leafMenuIDs on m.ID equals id 
          select new { m.ID, m.Name }; 
+0

내가 편집 한 게시물과 결과는 다음과 같습니다 : 아이들이없는 레코드 목록, 메뉴 테이블 스키마 : ID, 이름, 명령, 부모. 감사합니다 – NevenHuynh

+0

내 대답을 편집했습니다 –

+0

당신이 너무 많이 nasmifive 감사합니다 – NevenHuynh

관련 문제