用于 NHibernate 的 Linq 和预加载的 fetch 模式

Posted

技术标签:

【中文标题】用于 NHibernate 的 Linq 和预加载的 fetch 模式【英文标题】:Linq for NHibernate and fetch mode of eager loading 【发布时间】:2009-05-06 21:13:51 【问题描述】:

有没有办法使用 linq for nhibernate 将 fetchmode 设置为渴望多个对象。似乎有一种扩展方法,它只允许我设置一个对象。但是我需要为多个对象设置它。这可能吗?谢谢

【问题讨论】:

【参考方案1】:

新的 Linq 提供程序有点不同:

var customers = session.Query<Customer>().Fetch(c => c.Orders).ToList();

更多: http://mikehadlow.blogspot.com/2010/08/nhibernate-linq-eager-fetching.html

【讨论】:

如果Orders 有自己的子类,它会急切地加载吗?如果不是 - 您将如何更改查询以加载它? 获得孙子:var customers = session.Query&lt;Customer&gt;() .FetchMany(c =&gt; c.Orders) .ThenFetchMany(o =&gt; o.OrderLines).ToList();【参考方案2】:

多用一次。

IList<Entity> GetDataFromDatabase()

    var query = session.Linq<Entity>();
    query.Expand("Property1");
    query.Expand("Property2");
    return query.ToList();

【讨论】:

或 query.Expand("Property1,Property2"); 这是一种扩展方式吗?在 NHibernate.Linq v2.0.50727 中找不到它。 它就在那里,在 NHibernate.Linq.Query【参考方案3】:

据我所知,这并不等同:SetFetchMode 水合对象树,而 Expand 方法检索笛卡尔积。

【讨论】:

【参考方案4】:

继续@Mike Hadlow 回答,获取您需要做的下一级(孙子):

var customers = session.Query<Customer>() .FetchMany(c => c.Orders) .ThenFetchMany(o => o.OrderLines).ToList();

【讨论】:

以上是关于用于 NHibernate 的 Linq 和预加载的 fetch 模式的主要内容,如果未能解决你的问题,请参考以下文章

在 NHibernate 3.0 Linq 中急切加载多个兄弟姐妹和孙辈(堂兄弟?)的良好行为

我在哪里可以获得用于 NHibernate 的 Linq?

ActionScript 3 用于加载和预加载外部闪存或图像的通用类

用于加载和预加载外部闪存或图像的公共类

linq查询的问题

彻底检查电子邮件是不是存在,NHibernate,LINQ