提取树结构

时间:2013-11-27 22:02:05

标签: linq entity-framework linq-to-entities

如何使用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模型投影到查询中的视图模型上,但这并不像上面那么重要。

1 个答案:

答案 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是否应该被删除,因为它不在群组中?它应该留下来,因为你没有首先加载它?如果您考虑一段时间,您会发现部分加载相关实体集合的能力会增加很多复杂性,并且在某些情况下使行为非常不直观。

如果这还不够,您可以在数据库中创建视图或功能,并将这些视图或功能映射到您的模型,但我已经使用实体框架超过两年并没有遵循开发,所以我无法提供您将详细了解如何处理此事。