如何在表中编写查询记录,其父ID是条件parentID == 0和ID!=(parentID)

时间:2011-03-30 07:22:24

标签: linq linq-to-sql

这里我的LINQ查询在表菜单中获取记录条件是parentID == 0(获取根菜单)和ID!=(parentID列表)(父ID列表是具有子的菜单记录的id) ,我只想加载所有记录包括没有子记录和子记录的根菜单:

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();

我运行此代码,我显示没有孩子的记录,不显示chilren记录。有人帮我解决了。我在LINQ的新人,非常感谢。

我期望的结果是:没有任何孩子的记录列表,我的菜单表架构是:ID,Name,Order,ParentID。

1 个答案:

答案 0 :(得分: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 };