c# – 使用nhibernate Criteria API进行Eager Fetching

我试图在多个表上使用标准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;}
}

我的Criteria调用如下所示:

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

解决方法

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和Batched延迟加载来避免单个笛卡尔结果集并选择n 1.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...