用于 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<Customer>() .FetchMany(c => c.Orders) .ThenFetchMany(o => 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据我所知,这并不等同: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 中急切加载多个兄弟姐妹和孙辈(堂兄弟?)的良好行为