【发布时间】:2020-04-30 21:27:28
【问题描述】:
我有以下 EF 查询:
Checklist checklist = await context.Checklist.Where(c => c.CHECKLIST_ID == id)
.Include("Employee").Include("EmployeeArchive").Include("ChecklistResponses")
.Include("ChecklistComments").Include("ChecklistResponses.ChecklistQuestion.ChecklistGroup")
.Include("ChecklistResponses.ChecklistQuestion")
.Include("ChecklistResponses.Employee").FirstAsync();
我想在 ChecklistQuestion 实体上构建一个 where 子句,但它有 3 层深,我似乎无法在现在的 Where 子句中构建它。 ChecklistQuestion 与 ChecklistResponses 是一对多的关系。
我得到的是一个包含所有相关实体的单一实体清单。 ChecklistResponses 将有多行。我想要做的是将 ChecklistResponses 限制为 ChecklistQuestion.GROUP_ID != 4。
更新:根据 Microsoft,使用常规实体框架包含包含的实体是不可能的。 https://docs.microsoft.com/en-us/ef/ef6/querying/related-data?redirectedfrom=MSDN#explicitFilter 如果我不能在包含中执行此操作,我有两个选项。我可以过滤客户端。 (我有一个带有部分视图的主视图)。或者我可以做一个明确的 Load 语句。
【问题讨论】:
-
您能否告诉我们您希望从该查询中得到什么? “Where”子句表示清单的集合,但存储它的变量是单个实例。然后使用所有“包含”,看起来您想要一个包含所有相关数据的清单,以及所有这些数据的数据。请澄清一下,因为这很难解释,应该有人可以帮助你。
-
我已将其添加到我的问题中,谢谢。
-
您确实有第三种选择,即手动进行最终连接(不使用 .Include,而是使用 .GroupJoin)。这当然不如带有 FK 映射的 EF 灵活,但如果您的模型不经常更改,它应该是可行的。但是是的,EF6 不允许过滤包含的实体,而是返回整个连接结果。
-
这可能是一个不错的选择,因为无论如何我都必须按组进行分组。我稍后在客户端中进行分组,因为我无法弄清楚如何预先设置它。我已经发布了更新后的查询。
-
基本上我想在 ChecklistResponses.ChecklistQuestion.ChecklistGroup Include 上进行 GroupJoin,因为我希望能够按问题组进行迭代以按组显示调查问题列表。我实际上有这个工作,但正在进行分组,在我得到结果集后进行排序。我的另一个问题是我是否应该预先加载所有内容。我查看了生成的 SQL,它正在执行 UNION ALL。考虑到我拥有的所有 Include 语句,查询本身看起来非常可靠。我尝试显式加载相关实体,但似乎速度较慢。
标签: entity-framework entity-framework-6