问题描述
我正在尝试编写一个实体框架 lambda 表达式,以从两个表以及第四个子表中检索相关的子数据和两个相关的孙数据。这是关系。
父表是 Class。 Class 有一个名为 Course 的子表。 Course 有两个子表,CertificationLevel 和 CertificationType。 第四张表叫ClassLocation,是Class的子表。
我必须为所有检索到的 Class 数据引入所有相关的 Course、CertificationLevel、CertificationType 和 ClassLocation。
这是我目前得到的:
var recordList = ctx.Classes.OrderByDescending(r => r.ID).Include(c => c.Course).Include(cl => cl.ClassLocation).Take(300);
我四处寻找帮助并找到了这个网站 Include Multiple Levels,但它不起作用。这是我在使用 Include(i => i.Invoices.Select(it => it.Items))
时遇到问题的那一行。当我尝试修改我的 lambda 表达式时,无法识别 Select
方法。
那么,出了什么问题,我该如何纠正?
我使用的是 EF 6.4.4。我们使用的是 .NET 4.5.2
解决方法
在 EF Core 中,我会做这样的事情(不确定它对 EF 6.4.4 是否有帮助):
var data = context.Class
.Include(c => c.Course)
.ThenInclude(c => c.CertificationLevel ))
.Include(c => c.Course)
.ThenInclude(c => c.CertificationType))
.Include(c=> c.ClassLocation)
.ToList();
无法识别此选择?那很奇怪。我从未使用过 EF6.0,但它应该工作的每个信息点 https://docs.microsoft.com/en-us/ef/ef6/querying/related-data
recordList = ctx.Classes
.OrderByDescending(r => r.ID)
.Include(c => c.Course.Select(c=> c.CertificationLevel))
.Include(cl => cl.ClassLocation)
.Take(300);
在我发布的使用 EFCore 样式的 ThenInclude 安装 NuGet“Install-Package ThenInclude.EF6”的链接上有一些解决方案。但你不应该走那么远
,回到我引用的 Include Multiple Levels 链接,我想我会尝试“使用字符串路径”。那奏效了。所以现在我有了这个:
var recordList = ctx.Classes.OrderByDescending(r => r.ID).Include("Course.CertificationType").Include("Course.CertificationLevel").Include("Course.InstrumentModel").Include(cl => cl.ClassLocation).Take(PreselectThreshold);
我希望 lambda 表达式会起作用,但它没有。我确实包含了 System.Data.Entity
,但这没有区别。我仍然想知道这个问题是否与我们使用 .NET 4.5.2 进行开发有关。无论如何,对于其他为此苦苦挣扎的人,请尝试使用字符串路径方法。