我有一个数据库架构,如下所示:
这是我急切需要为我的数据加载的代码:
var item = db.Course
.Include(p => p.CourseInstructor)
.FirstOrDefault(p => p.CourseId == courseId);
if (item == null)
{
return NotFound();
}
return (from p in item.CourseInstructor
select p.Instructor).ToList();
我所能获得的只是null
导航属性上的p.Instructor
。
我曾尝试使用ThenInclude
,但我不知道如何正确编码。
如何使用Eager加载技术使此代码按预期工作,以获取完整的Person
数据?
答案 0 :(得分:0)
我终于意识到ThenInclude
有两个签名。对于navigationPropertyPath
参数,这两个签名是不同的:
Expression<Func<CourseInstructor, Person>>
Expression<Func<ICollection<CourseInstructor>, ICollection<CourseInstructor>>
在Visual Studio 2017中,将仅选择一个签名来提供IntelliSense建议。在我的VS2017中,将选择第二个签名。这样我就看不到第一个签名的任何建议。
以下屏幕截图是我的意图的“正确”签名,但VS2017将不选择此签名。
对于我来说,我需要做的只是输入所需的navigationPropertyPath
。在没有IntelliSense帮助的情况下输入正确的属性名称。错误检查将通过,您的项目将能够正确构建!
这是我在下面编写的最终代码:
var item = db.Course
.Include(p => p.CourseInstructor)
.ThenInclude(i => i.Instructor)
.FirstOrDefault(p => p.CourseId == courseId);
if (item == null)
{
return NotFound();
}
return (from p in item.CourseInstructor
select p.Instructor).ToList();
它只是按预期工作。
此已知错误已在此处跟踪:Completion missing members of lambda parameter in fault tolerance case · Issue #8237 · dotnet/roslyn