无法使用 Include 或 ThenInclude 或 Select/Many with ONE 查询加载相关数据

Eli*_*eth 3 c# entity-framework-core

1 个测试分配了 1 个测试类型。

我需要加载与 Test 相关的所有 TestType 实体 OR not 和 Schoolclass , Subject 和 Assigned Pupils 到测试 (PupilsTests)

.SelectMany 或 .Select 在运行时失败。

我尝试了 Include 和 ThenInclude 的不同组合,但没有机会通过 PupilsTests 获得测试。

当我开始查询时,我只能通过测试获得 PupilsTests context.Tests

但这导致我只得到分配给测试的测试类型 - 内连接- 但我需要所有测试类型及其测试和他们的学生测试,我希望在一个查询中使用它。

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; }


    }
Run Code Online (Sandbox Code Playgroud)

Iva*_*oev 5

EF6 的 EF Core 等效语法

.Include(x => x.Tests.SelectMany(z => z.PupilsTests))
Run Code Online (Sandbox Code Playgroud)

.Include(x => x.Tests).ThenInclude(x => x.PupilsTests)
Run Code Online (Sandbox Code Playgroud)

请注意,内部似乎存在 VS Intellisense 问题 ThenInclude,因此只需键入以上内容,它将成功编译并运行。

另请注意,EF Core 处理集合包含的内容不同(不像 EF6 中那样使用单个查询),因此上述内容将生成并执行 3 个 SQL 查询。

更新:现在 VS Intellisense 问题在 EF Core 文档中包含多个级别部分下特别提到:

笔记!

当前版本的 Visual Studio 提供不正确的代码完成选项,并且ThenInclude在集合导航属性之后使用该方法时,可能会导致正确的表达式被标记为语法错误。这是在https://github.com/dotnet/roslyn/issues/8237 上跟踪的 IntelliSense 错误的症状。只要代码正确并且可以成功编译,就可以安全地忽略这些虚假的语法错误。