渴望用nhibernate Criteria API获取

时间:2012-01-11 13:16:34

标签: c# nhibernate eager-loading

我正在尝试在多个表上使用标准Api并且需要加载。

我的精简实体看起来像这样:

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;}
}

我的标准电话看起来像这样:

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上阅读了其他一些问题。但仍然没有运气。

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

先谢谢彼得

When must we use eager loading in NHibernate? What is it's usage?

NHibernate Eager Fetching Over Multiple Levels

Ayende Blog

1 个答案:

答案 0 :(得分: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查询。更好的方法是

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