0

我有一个规范化的数据库,并且无法制作一个 EF 查询来执行选择,一次将来自多个不同表的足够信息连接在一起。

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

数据模型如下所示:

  • Template有一个 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 实体的测量实体。所以我做了以下事情(因为 TemplateMeasurements 是一个列表):

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

完美的。出色的。(极好。)现在对于每个 TemplateMeasurement,它正在加入以提取适当的测量记录。

但是……这还不够好。我还希望每个测量对象的“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();

这也有效!(生活不是很美好吗?)

但是等一下............我想要的每个测量对象上都有另一个相关实体,称为“审查”。

我怎么也应该急切地去拿这个???它不会进入上面的 .Select() 方法调用......因为该方法已被用于拉入“ref_MeasurementType”实体。

我如何也急切地获取此查询中的“评论”实体?

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

4

1 回答 1

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();

解决方案是简单地添加 ANOTHER .Include() 行,该行遍历相同的“TemplateMeasurements”集合....但是在最后的 Select() 方法中,您可以指定要急切抓取的其他实体。

于 2013-12-10T19:08:57.420 回答