代码之家  ›  专栏  ›  技术社区  ›  Chaddeus

要生成非空嵌套菜单的Linq查询?

  •  0
  • Chaddeus  · 技术社区  · 16 年前

    要查看我的实际问题,请访问www.apoads.com并将鼠标悬停在“本地企业”菜单项上。它是由数据库调用生成的一系列嵌套的无序列表。继续点击“本地企业”下面的一些项目,你会看到大多数类别都是空的(这个网站是非常新的)。

    问题: 我只想显示实际包含本地业务的类别。以下是我的类别架构:

    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;
    

    这也不起作用,因为父类别下永远不会有任何业务。所以看起来我需要做某种逆递归,但我不知道该怎么做。

    或者,也许我让自己的事情变得困难,我需要改变我的数据库模式?

    3 回复  |  直到 16 年前
        1
  •  0
  •   Daniel Rikowski    16 年前

    创建类来保存这样的信息

    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遍历它。

    您还可以为执行.join()扩展方法

    where d.ParentID == c.BizCatID && d.Bizs.Count()
    
        2
  •  0
  •   Jonathan Parker    16 年前

    我不确定递归位,但这可能会让你开始。是两级查询。 我猜你想支持任何级别。

    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
                               };
    
        3
  •  0
  •   Chaddeus    16 年前

    像这样的查询接近我需要的:

    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查询,并准确地提取出我需要的内容。不是在我现在可以测试它的计算机上,而是在我可以的时候回答。谢谢!