我在使用EF的ASP.NET项目中工作,我在查找正确的查询时遇到了一些麻烦。 我需要在没有延迟加载的情况下工作。
我有以下数据结构: 模块包含页面。 页面包含PageItems。 PageItem包含一个Item。 一个项目可以包含其他项目。
首先省略包含Items的Items的递归方面,我需要一个查询来将单个模块的结构提供给treeview。
我想要的是:
我从这开始:
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,任何帮助都会非常感激。
答案 0 :(得分:2)
由于您需要嵌套集合中的条件,因此应使用join
,例如:
(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()
我将base._entities
缩写为c
(对于上下文)并对Id名称做了一些假设,可能忽略了奇怪的语法错误,但这应该是一个好的开始。