NHibernate-动态定义抓取策略
让我解释一下这个问题——希望我在标题中已经很好地定义了它,但我想确定一下 我有一个linq查询,它可以回调一堆对象(比如说Foos)。每个Foo都有一个对用户的引用。每个用户都有一个对某人的引用: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
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
对于LinqyohaveExpand
(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 ....)