代码之家  ›  专栏  ›  技术社区  ›  David

NHibernate-动态定义获取策略

  •  1
  • David  · 技术社区  · 14 年前

    让我来解释这个问题-希望我在标题中已经很好地定义了它,但我想确定。

    我有一个linq查询,它可以收回一堆对象(比如Foos)。每个Foo都有一个对用户的引用。每个用户都有一个对某人的引用:

    public class Foo
    {
      //properties omitted...
      public User CreatedBy {get;}
    }
    public class User
    {
      //properties omitted...
      public Person Person {get;set;}
    }
    

    如对象结构所示,在数据库中,Foo将多对一与用户相关联,而用户将多对一与人相关联。

    当我运行查询时,我为Foos得到一个SELECT,然后为所有用户和人员分别得到一个SELECT。很明显,我更喜欢一个单一的选择和几个连接。

    我不一定要在映射配置中指定Foos总是急切地获取用户,或者用户总是急切地获取个人,但是我希望能够在这个实例中指定。

    谢谢

    3 回复  |  直到 14 年前
        1
  •  3
  •   Diego Mijelshon    14 年前

    所有NHibernate查询方法都有指定预取的方法。

    为了 标准 ,你有 SetFetchMode .

    为了 HQL公司 [inner|left] join fetch .

    林克 你有吗 Expand (2.x分担)/ Fetch

    为了 AddJoin .

        2
  •  0
  •   DanP    14 年前
        3
  •  0
  •   Stefan Steinegger    14 年前

    <class name="Person" batch-size="20">
    ...
    </class>
    

    在集合级别使用批量大小:

    <map
        name="SomeCollection"
        batch-size="20">
      ...
    </map>
    

    当加载其中一个引用时,NHibernate使用如下查询一次加载20个:

    select ... from Person where user_fk in (23, 34, 6, 667, 6745, 234 ....)
    

    N+1 N / 20 + 1 ,非常好。