LINQ:如何使嵌套的select语句有条件?

LINQ:如何使嵌套的select语句有条件?,linq,select,include,where,Linq,Select,Include,Where,我在使用EF的ASP.NET项目中工作,在查找正确的查询时遇到一些问题。 我需要在没有惰性加载的情况下工作 我有以下数据结构: 模块包含页面。 页面包含页面项。 PageItem包含一个项目。 一个项目可以包含其他项目 首先不考虑包含项的项的递归方面,我需要一个查询将单个模块的结构提供给树状视图 我想要的是: 具有给定ID的模块 包括所有页面 包括所有页面项目 包括ParentItem_ID==0的所有项 包括所有子项 我从这个开始: return base._entitie

我在使用EF的ASP.NET项目中工作,在查找正确的查询时遇到一些问题。 我需要在没有惰性加载的情况下工作

我有以下数据结构: 模块包含页面。 页面包含页面项。 PageItem包含一个项目。 一个项目可以包含其他项目

首先不考虑包含项的项的递归方面,我需要一个查询将单个模块的结构提供给树状视图

我想要的是:

  • 具有给定ID的模块
    • 包括所有页面
      • 包括所有页面项目
        • 包括ParentItem_ID==0的所有项
          • 包括所有子项
我从这个开始:

return base._entities.Modules
            .Include(m => m.Paginas
                .Select(p => p.PaginaItems
                    .Select(pi => pi.Item)
                    .Select(i => i.ChildItems)))
            .Where(m => m.Module_ID == id)
            .FirstOrDefault();
此查询可以工作,但它会忽略项目层次结构,并将所有项目显示为页面的直接子项。实际上需要的是这样的东西:

return base._entities.Modules
           .Include(m => m.Paginas
               .Select(p => p.PaginaItems
                   .Select(pi => pi.Item)
                   .Where(i => i.I_ParentItem_ID == 0)
                   .Select(i => i.ChildItems)))
           .Where(m => m.Module_ID == id)
           .FirstOrDefault();
但它不起作用


我是LINQ的新手,任何帮助都将不胜感激

当您需要嵌套集合中的条件时,您应该使用,例如:


我将
base.\u entities
缩写为
c
(用于上下文),并对Id名称做了一些假设,可能忽略了奇怪的语法错误,但这应该是一个好的开始。

在这种情况下,您应该使用显式
连接
s.WOW,这非常有用。现在我明白了。尽管我不得不稍微修改一下查询:我必须编写selectnew{mod,pag,pi,item},而不是selectmod,然后返回qry.mod,否则模块的导航属性为null。
(from mod in c.Modules
join pag in c.Paginas on mod.Module_Id equals pag.Module_Id
join pi in c.PaginaItems on pag.Pagina_Id equals pi.Pagina_Id
join item in c.Items.Where(i => i.I_ParentItem_ID == 0) on pi.PaginaItem_Id
    equals item.PaginaItem_Id
join ci in c.ChildItems on item.I_ParentItem_ID equals ci.I_ParentItem_ID
select mod).FirstOrDefault()