关于c#:使用nhibernate Criteria API进行Eager Fetching

Eager Fetching with nhibernate Criteria API

我正试图在多个表上使用标准API,并希望加载这些表。

我的精简实体如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Limit
{
    Risk {get; set;}
}

class Risk
{
   List<Company> Companies { get;set;}
}

class Company
{
  List<Address> OldAdresses {get;set;}
}

class Address
{
  string Street { get;set;}
}

我的条件调用如下:

1
2
3
4
5
6
7
8
var CriterionGruppe = Expression.Eq("Account.Id", someGuid);

var temp = _transaktion.Session.CreateCriteria(typeof(Limit))
.SetFetchMode("Risk", FetchMode.Eager)
.SetFetchMode("Risk.Companies", FetchMode.Eager)
.Add(CriterionGruppe)
.SetResultTransformer(new DistinctRootEntityResultTransformer())
.List<Limit>();

地址仍然加载有许多选择。我怎样才能把公司的旧地址包括在我的标准电话中呢?

我已经在Ayende的博客上读到了一篇博客文章,在StackOverflow上也读到了其他几个问题。但仍然没有运气。

我希望有人能给我指明正确的方向。

提前谢谢彼得

我们什么时候必须在NHibernate中使用急装?它的用法是什么?

NHiberinate在多个层次上的渴望获取

艾文德博客


1
2
3
4
5
6
7
8
var account = _transaktion.Session.Load<Account>(someGuid);
var temp = _transaktion.Session.CreateCriteria(typeof(Limit))
    .SetFetchMode("Risk", FetchMode.Eager)
    .SetFetchMode("Risk.Companies", FetchMode.Eager)
    .SetFetchMode("Company.OldAddresses", FetchMode.Eager)
    .Add(Expression.Eq("Account", account))
    .SetResultTransformer(new DistinctRootEntityResultTransformer())
    .List<Limit>();

然而,这是非常低效的。您正在加载大量重复数据以进行1个SQL查询。更好的方法是

  • 加载实际需要的投影
  • 使用Futures和批量延迟加载来避免单个笛卡尔结果集,并选择n+1。