如何使用linq查询和EF检索分层树结构?
我的数据库包含Tab
的表格,其为1对多到TabGroupBox
,即1到多对FieldDetail
我想根据某些标准检索结构的部分内容。
说,我在数据库中有以下内容:
标签(名称)
"Tab1"
"Tab2"
"Tab3"
TabGroupBox(Tab.Name,Name)
"Tab1", "Group1"
"Tab2", "Group2"
"Tab1", "Group3"
FieldDetail:(TabGroupBox.Name,Name,FieldStatus)
"Group1", "Field1", "Good1"
"Group2", "Field2", "Good2"
"Group3", "Field3", "Bad"
"Group1", "Field4", "Good3"
"Group1", "Field5", "Bad"
如果FieldStatus的标准包含“Good”,那么我正在寻找的结果是:
Tab1
-Group1
--Field1
--Field4
Tab2
-Group2
--Field2
然而,目前似乎只能得到
Field1
Field2
Field4
或与字段
对应的制表符重复Tab1
Tab1
Tab2
我的非工作查询示例:
Tabs.SelectMany(x => x.TabGroupBoxes.SelectMany(y => y.FieldDetails).Where(z =>
(z.FieldDetailType.Contains("Good")
))
.Select(x => x.TabGroupBox.Tab)
我也尝试过使用.Include()
但没有成功
此外,如果可能的话,我想将db模型投影到查询中的视图模型上,但这并不像上面那么重要。
答案 0 :(得分:0)
您可以做的最好的事情如下。
context.FieldDetails
.Include(fieldDetail => fieldDetail.GroupBox.Tab) // Use eager loading.
.Where(fieldDetail => fieldDetail.FieldDetailType.Contains("Good")))
.AsEnumerable() // We will do the remaining work client side.
.Select(fieldDetail => fieldDetail.GroupBox.Tab)
.Distinct() // Get rid of duplicate tabs.
.ToList()
不可能的是,部分地检索相关entites的集合,例如仅Group1
而不是Group3
Tab1
。如果你能做到这一点,会引起一些麻烦。如果您为Tab1
提交更改,该怎么办? Group3
是否应该被删除,因为它不在群组中?它应该留下来,因为你没有首先加载它?如果您考虑一段时间,您会发现部分加载相关实体集合的能力会增加很多复杂性,并且在某些情况下使行为非常不直观。
如果这还不够,您可以在数据库中创建视图或功能,并将这些视图或功能映射到您的模型,但我已经使用实体框架超过两年并没有遵循开发,所以我无法提供您将详细了解如何处理此事。