【问题标题】:How to create a where expression in nested entities如何在嵌套实体中创建 where 表达式
【发布时间】: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


【解决方案1】:

首先,在使用 LINQ 扩展方法时,使用 lambda 表达式语法更为常见,所以我将使用它。然后,我认为您需要“ThenInclude”扩展,这将允许您正在寻找什么。为了更简洁,我省略了额外的包含。

Checklist checklist = await context.Checklist.Where(c => c.CHECKLIST_ID == id)             
    .Include(c => c.ChecklistResponses)
    .ThenInclude(c => c.ChecklistResponses.
    .Where(q => q.ChecklistQuestion.GROUP_ID != 4))
    .FirstOrDefaultAsync();

【讨论】:

  • 但这不是 EF Core 语法吗?
  • EF6 和 EF Core 都支持 LINQ 和 Lambda 查询。这是 C# 功能,而不是 EF 功能。它们是等价的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-06
  • 2013-09-13
  • 1970-01-01
  • 1970-01-01
  • 2018-11-27
  • 1970-01-01
相关资源
最近更新 更多