在Entity Framework中使用带有条件的ThenInclude

3
return _companyRepository.GetAll().Where(company => company.Id == Id)
             .Include(company => company.offices.Where(o => o.IsActive))
             .ThenInclude(office => office.People.Where(p => p.IsFired))
             .ThenInclude(person => person.Children)
             .ToList(); 

我该如何使用Entity Framework Core获取所有活动办公室中被解雇的员工?
我遇到了以下错误:
“Where”子句在ThenInclude或Include中无效。
company.offices.Where(o => o.IsActive) 
office.People.Where(p => p.IsFired)

我知道不能在Include语句中使用Where。问题是如何使用Include子句过滤数据?


不要将Where表达式放入Include中。 - undefined
为什么要这样做呢?你可以简单地使用.Select()方法。实际上,我不明白为什么人们要使用Include方法。Select方法非常简单明了。如果有人能向我解释一下,我会非常感激。 - undefined
3个回答

3

0

如果你在查询中使用了数据,就不需要使用任何IncludeInclude只是一种禁用延迟加载的方法。 Include控制导航属性是否填充数据,而不是用于过滤。

你的查询还会返回公司(包括人员),而不仅仅是人员。

  return _companyRepository.GetAll().Where(company => company.Id == Id)
         .SelectMany(company => company.offices)
         .Where(o => o.IsActive)
         .SelectMany(office => office.People)
         .Where(p => p.IsFired) 
         .Include(person => person.Children)
         .ToList(); 

这将创建一个包含人员及其子女的列表。 最后的include控制语句表示,所有子女都会通过此查询加载。如果删除此include,仍然可以访问子女,但这时是按需加载或延迟加载。在程序功能上您不会注意到任何差异,但与SQL服务器的通信会有所不同。

0
这在EF Core 5中变得可能。请参阅这个stackoverflow和支持的Microsoft Docs。这是他们的示例:
var blogs = context.Blogs
    .Include(e => e.Posts.Where(p => p.Title.Contains("Cheese")))
    .ToList();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接