1测试分配了1个TestType。
我需要加载与Test OR not和Schoolclass,Subject和Assigned Pupils相关的所有TestType实体到测试(PupilsTests)
.SelectMany或.Select在运行时失败。
我尝试了Include和ThenInclude的不同组合,但没有机会通过PupilsTests进行测试。
当我使用context.Tests
但结果是我只得到分配给Test的TestTypes - innerjoin - 但我需要所有TestTypes及其测试和他们的PupilsTests,我想在一个查询中。
var testtypes = await context.TestTypes
.Include(x => x.Schoolclass)
.Include(x => x.Subject)
.Include(x => x.Tests.SelectMany(z => z.PupilsTests))
.Where(t => t.SchoolyearId == schoolyearId)
.AsNotTracking()
.ToListAsync();
public class TestType
{
public TestType()
{
Tests = new HashSet<Test>();
}
// Props removed for clarity
public int Id { get; set; }
public ISet<Test> Tests { get; set; }
public Schoolyear Schoolyear { get; set; }
public Schoolclass Schoolclass { get; set; }
public Subject Subject { get; set; }
public int SchoolyearId { get; set; }
}
public class Test
{
public Test()
{
PupilsTests = new HashSet<PupilTest>();
}
// Props removed for clarity
public int Id { get; set; }
public ISet<PupilTest> PupilsTests { get; set; }
public TestType TestType { get; set; }
}
答案 0 :(得分:4)
EF6的EF核心等效语法
.Include(x => x.Tests.SelectMany(z => z.PupilsTests))
是
.Include(x => x.Tests).ThenInclude(x => x.PupilsTests)
请注意,ThenInclude
内部似乎存在VS智能感知问题,因此只需输入上述内容即可成功编译并正常工作。
另请注意,EF Core进程集合包含不同(不使用EF6中的单个查询),因此上面将生成并执行3个SQL查询。
更新:现在,在Including multiple levels部分的EF Core文档中特别提到了VS智能感知问题:
注意!
当前版本的Visual Studio提供了错误的代码完成选项,并且在收集导航属性后使用
ThenInclude
方法时,可能会导致正确的表达式被标记为语法错误。这是https://github.com/dotnet/roslyn/issues/8237跟踪的IntelliSense错误的症状。只要代码正确并且可以成功编译,就可以安全地忽略这些伪造的语法错误。