1

我有以下模型:

  A
  1
  |
  *
  B
^   ^
|   |
B1  B2

其中 B 是 B1 和 B2 的抽象超类。我现在有一个 PSQuery,例如:

var data = es.PSQuery<A>().Where(..).SelectMany(x => x.Bs).ToList();

生成的 SQL 如下所示:

SELECT ALIAS.ID FROM B ALIAS WHERE ....

然后 MDriven 获取块中的所有鉴别器以确定对象的类型,因此这些可以是一些 SQL:

SELECT ALIAS.ID, ALIAS.DISCRIMINATOR FROM B ALIAS WHERE ID in (?, ? ....)

现在 MDriven 知道类型并可以加载数据。总而言之,这个过程比手工 SQL 花费的时间要长得多。所以我的问题是:

  1. 我可以从 PSQuery 获取 SQL 以便我自己执行它吗?在这种情况下,我构建了一个非常复杂的表达式,我更喜欢构建 PSQuery 来构建 SQL 字符串。
  2. 如果 MDriven 将在第一个 SQL 中加载描述符,则不需要延迟加载。我们为此表使用自定义 OR-Mapping。是否可以将鉴别器包含在第一个 SQL 中?
  3. 是否有不同的提示来防止这种耗时的加载行为(保持模型不变)?
4

1 回答 1

0

第一:如果您需要多个类的结果集(抽象结果集),您的加载时间将受益于子类父映射(子类写在一个 - 父 - 表中)

从 PSQuery 获取生成的 SQL:

 var sqltext = this.EcoSpace.OclPs.ReturnPlatformQuery(null, vars, model.OclPS);

您可以有子类的父、子或自己的映射。当您拥有“拥有”时,您将获得每个子类 1 个表 + 每个超类 1 个表。在这种情况下,我们首先根据鉴别器减少到特定的 id - 然后获取每个子类的数据

于 2021-11-27T14:00:52.013 回答