EF Eager Load - 如何深入加入多个表?

时间:2013-12-10 19:08:57

标签: .net entity-framework entity-framework-5 eager-loading querying

我有一个规范良好的数据库,并且无法制作EF查询以执行一次选择从几个不同的表中连接足够的信息。

我意识到我可以发出单独的查询来引入相关数据,但我想看看是否可以一次查询所有内容(热切地)。

数据模型如下所示:

  • 模板有一个ref_TemplateType,一个ref_FormType和许多TemplateMeasurements
  • TemplateMeasurement 有一个Measurement
  • 度量有一个ref_MeasurementType和一个Review

我想提取所有模板的列表,包括上面的所有关联实体。

以下是我的开始:

var test = dc.Templates
    .Include(x => x.ref_TemplateType)
    .Include(x => x.ref_FormType)
    .Include(x => x.TemplateMeasurements)
    .ToList();

到目前为止一切顺利。

不,我想要包含属于每个TemplateMeasurement实体的Measurement实体。所以我做了以下(因为TemplateMeasurements是一个列表):

var test = dc.Templates
    .Include(x => x.ref_TemplateType)
    .Include(x => x.ref_FormType)
    .Include(x => x.TemplateMeasurements.Select(y => y.Measurement))
    .ToList();

PERFECT。优秀。 (棒极了。)现在每个TemplateMeasurement都会加入相应的Measurement记录。

但......那还不够好。我还想要每个Measurement对象的'ref_MeasurementType'相关实体。所以我像这样改进我的查询:

var test = dc.Templates
    .Include(x => x.ref_TemplateType)
    .Include(x => x.ref_FormType)
    .Include(x => x.TemplateMeasurements.Select(y => y.Measurement.ref_MeasurementType))
    .ToList();

这也有效! (生活不美妙吗?)

但是等一下........我想要的每个Measurement对象上都有另一个相关的实体,名为“Review”。

我怎么能热切地拿这个呢?它不会进入上面的.Select()方法调用...因为该方法已被用于引入'ref_MeasurementType'实体。

我如何热切地在此查询中获取“评论”实体?

(见下文,因为我在写出这个问题时提出了解决方案)

1 个答案:

答案 0 :(得分:2)

在撰写问题时想出了这个解决方案。 :)

我测试了它,并根据需要针对SQL Server生成单个选择查询。

var test = dc.Templates
    .Include(x => x.ref_TemplateType)
    .Include(x => x.ref_FormType)
    .Include(x => x.TemplateMeasurements.Select(y => y.Measurement.ref_MeasurementType))
    .Include(x => x.TemplateMeasurements.Select(y => y.Measurement.Review))
    .ToList();

解决方案是简单地添加遍历相同“TemplateMeasurements”集合的另一个.Include()行....但是在这次结束时的Select()方法中,您可以指定另一个实体< / strong>你想急切地抓住。