2011-03-30 70 views
0

在這裏我的LINQ查詢獲取條件表菜單中的記錄是parentID == 0(獲取根菜單)和!ID =(的parentID列表)(這是父ID列表是是具有子菜單記錄的ID),我只是想加載所有記錄包括那些沒有孩子的記錄和兒童記錄根菜單:我怎麼能寫在表中有parentID與條件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(); 

我運行這段代碼,顯示沒有孩子的記錄,不顯示孩子記錄。有人幫我修理它。我在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。然後做從菜單中選擇通過參加leafIDs

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,姓名,訂單,ParentID。謝謝 – NevenHuynh 2011-03-30 10:17:11

+0

我編輯了我的答案 – 2011-03-30 18:33:20

+0

非常感謝你nasmifive – NevenHuynh 2011-03-31 02:00:14

相關問題