【问题标题】:How to load child collection after loading the parent with nhibernate?用nhibernate加载父级后如何加载子级集合?
【发布时间】:2012-03-13 21:13:37
【问题描述】:

我有这个模型

Product
- int Id
- string Name
- List<ProductChannelAffectation> Affectations

ProductChannelAffectation
- Channel Channel
- Product Product
- double Price

所以我想在 2 次查询(没有 N+1 问题)中获得第 10 个符合某些条件的产品及其影响,如果可能的话,在 1 次访问数据库中。

所以我读了这个答案

https://stackoverflow.com/a/7035649/277067 或者这个 https://stackoverflow.com/a/5285739/277067

但是这里有两个问题:

  • 条件在 2 个查询中重复“Where(x => x.Id == ID)”,当它是简单条件时没关系,但如果它是复杂条件(涉及其他表、文本搜索.. .)

  • 没有“顶部”条件。

这里的延迟加载会导致 N+1 问题。

我试过了

var products = _nhSession.QueryOver<Product>()
    .Where(...)
    .Take(10)
    .List()
    .ToList();
var idsproduct = products.Select(p => p.ID);
var affectation = _nhSession.QueryOver<ProductChannel>()
    .Where(c => c.Product.ID.IsIn(idsproduct))
    .ToList();

但是在执行第二个查询之前还有 N+1 (用于获取伪装)。

这是我的关联的声明方式

  <bag name="Affectations" access="property" table="Product" lazy="false">
      <key column="n_Product" />
      <one-to-many class="CTV.ProductChannel, CTV" />
    </bag>

我正在使用 activerecord 进行声明。

【问题讨论】:

    标签: c# nhibernate


    【解决方案1】:

    您是否尝试过设置批量大小

     <bag name="Affectations" ... batch-size='50'>
    

    这将停止您的 n+1 问题并允许您保持延迟加载。基本上将批量大小设置为 50 会将向数据库发出的查询量减少 50 倍。如果没有设置,如果您有 99 行,您将向数据库发出 99 次查询,批量大小设置为您将发出 2。

    【讨论】:

    • 我确实在我的问题之后找到了它。但它的行为不像你说的那样看这里:stackoverflow.com/a/6293687/277067。文档是错误的。
    • 什么不起作用? batch-size 将解决您的问题,您指出的问题是“批量大小”如何工作。你试过并查看生成的 SQL 了吗?
    • 是的,我做了,例如,如果我有 50 个批量大小,我有 30 个产品,它将首先加载 25 个产品的影响,然后是 5 个产品的影响。
    • 在我的情况下这不是一个真正的问题,但你的解释是错误的,批量大小为 50 和 99 的产品我会收到超过 2 个请求。
    【解决方案2】:
    // subquery for the ids
    var idsproduct = QueryOver.Of<Product>()
        .Where(...)
        .Take(10);
    var affectation = _nhSession.QueryOver<Product>()
        .WithSubquery.Where(p => p.ID).In(idsproduct))
        .Fetch(p => p.Affectations).Eager
        .ToList();
    

    【讨论】:

      猜你喜欢
      • 2015-02-15
      • 1970-01-01
      • 1970-01-01
      • 2010-10-08
      • 1970-01-01
      • 1970-01-01
      • 2012-04-17
      • 2013-03-29
      • 1970-01-01
      相关资源
      最近更新 更多