NHibernate-动态定义抓取策略

NHibernate-动态定义抓取策略,nhibernate,select,nhibernate-mapping,eager-loading,Nhibernate,Select,Nhibernate Mapping,Eager Loading,让我解释一下这个问题——希望我在标题中已经很好地定义了它,但我想确定一下 我有一个linq查询,它可以回调一堆对象(比如说Foos)。每个Foo都有一个对用户的引用。每个用户都有一个对某人的引用: public class Foo { //properties omitted... public User CreatedBy {get;} } public class User { //properties omitted... public Person Person {get

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

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

public class Foo
{
  //properties omitted...
  public User CreatedBy {get;}
}
public class User
{
  //properties omitted...
  public Person Person {get;set;}
}
正如对象结构所建议的,在数据库中,Foo将多对一与用户关联,用户将多对一与人关联

当我运行查询时,我为foo获取一个SELECT,然后为所有用户和人员获取一个SELECT。显然,我更喜欢一个带有几个连接的单选择

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

有办法吗

谢谢


David

同时提供了NHibernate动态抓取策略的示例实现,这将为您提供一个良好的起点。

所有NHibernate查询方法都有指定快速抓取的方法

对于标准,您有
SetFetchMode

对于HQL,您有
[inner | left]加入fetch

对于Linqyohave
Expand
(2.x contrib)/
Fetch
(3.x)


对于SQL你有
AddJoin

另外一个不错的答案:你也可以使用批处理。这减少了N+1问题而不会带来太多痛苦:

在类级别上使用批大小:

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

所以它将
N+1
转换为
N/20+1
,这很好。

什么意思:“在这个例子中指定”?谢谢。我要的是林克。这个新版本的Linq to NHibernate现在可用吗?我什么都找不到。阿尔法只是个名字。微软会将处于相同状态的产品称为“Beta2”或“RC”。NHibernate使用连续集成,因此这个Alpha实际上比稳定的2.1.2有更少的bug。
<map
    name="SomeCollection"
    batch-size="20">
  ...
</map>
select ... from Person where user_fk in (23, 34, 6, 667, 6745, 234 ....)