【问题标题】:Fluent NHibernate One-to-Many Mapping Results in Bad QueryFluent NHibernate 一对多映射导致错误查询
【发布时间】:2014-01-29 22:54:03
【问题描述】:

我使用 Fluent NHibernate 有一个非常简单的一对多映射,它工作正常,除了 NH 生成的查询不太理想。我从 NH 检查 sql 日志时发现了这一点。

我要找的查询是这样的

select p.*, c.* from parent p inner join child c on p.Id = c.parentId

其中 p.ID 是父表的 PK,c.ParentId 是子表中指向父表 PK 的 FK。

但是我从sql日志中发现是这样的:

select P.* from Parent

随后是一堆针对子表运行的查询,例如

select * from child c where c.ParentId = @p0

这会导致性能问题,这并不奇怪。

我的问题是为什么 NH 不生成我认为应该生成的内部连接查询?我需要进行哪些更改才能使 NH 生成所需的查询?

【问题讨论】:

    标签: nhibernate fluent-nhibernate


    【解决方案1】:

    JOIN 不适用于这种情况。它将产生 SELECT 导致更多行,然后 Parent 表有。即:父级的 每个 子级将追加新行。

    此处的适当解决方案是将这些选择分开。首先选择父母,然后为所有父母加载所有孩子(仅选择父母)。 NHibernate 对此确实有很好的解决方案:

    这将与您所经历的有点相似。首先选择父母,然后选择孩子(人)。最大的不同是,我们现在分批获取更多的孩子,而不是1 + N(分别为每个孩子收集)。所以它可能是 1 + 2

    批量大小映射示例

    1) 收藏

    HasMany<Child>(x => x.Children)
      .BatchSize(25);
    

    2) 实体本身

    public ChildMap()
    {
        Id(x => x....
        ...
        BatchSize(25);
    

    还有许多其他优势,其中 PAGING 是最有利可图的优势之一。因为我们正在使用一个平面(非乘)父,我们可以申请.Take().Skip()

    最后,我们想根据孩子找到一些父母,我们可以在这个场景中使用子查询:15.8. Detached queries and subqueries

    【讨论】:

    • 非常感谢!我会尝试,我会得到结果。
    • 很高兴报告 batchSize(25) 在减少要运行的查询数量方面确实有效。我们有 22 个查询,现在我看到了 2 个查询,第一个查询获取前 12 条记录,第二个查询获取其余记录。这是相当不错的。但我有一个问题。由于集合上的 BatchSize 设置为 25,为什么我会收到两个查询?我期待一个查询子记录数(22)。谢谢。
    • 绝对! ;) 这正是我们可以通过此映射实现的。我想说,你真的做到了;)现在你可以玩这个设置了。我确实将此设置应用于 EVERY 集合和 EVERY 类映射。为什么?因为如果你有几个many-to-one和一些one-to-many在当前操作中扮演关键角色......所有都是懒惰的但有效batches
    • 这真的有很大的不同!但是您可能还没有看到我第二条评论的第二部分。我问了一个关于 BatchSize 对集合的确切影响的问题。我有 22 条子记录,并且我已将子集合的批处理大小设置为 25。对于此设置,我希望看到一个查询,但我仍然看到两个查询,第一个检索前 12 条记录,第二个检索其余记录。我也尝试将数字增加到 50,但仍然得到相同的结果。但是当我将批处理大小减少到 10 时,我确实得到了预期的结果。三个查询,前两个每个有 10 条记录。
    • 约翰,我不知道这里的准确和正确答案。我也有同样的经历。你说的对。我想有一些“智能”计算,一些优化......所以,最后,我知道选择的数量可能低于设置。但是,SQL SELECT 语句的总量......如果没有该设置,则更少......对不起,我在这里没有更好的答案;)我不是 NHibernate 开发人员,并且没有像我一样深入研究这个可以
    猜你喜欢
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    相关资源
    最近更新 更多