有没有办法使用linq for nhibernate将fetchmode设置为渴望多个对象.似乎有一种扩展方法,它只允许我设置一个对象.但是我需要为多个对象设置它.这可能吗?谢谢
我有一个相当深的对象图(5-6个节点),当我遍历它的部分时,NHProf告诉我我有一个"选择N + 1"问题(我这样做).
我所知道的两个解决方案是
我真的不想做这些中的任何一个(虽然我可能会稍后将图表分开,因为我预测它会增长)
目前....
是否有可能告诉NHibernate(使用FluentNHibernate)每当我尝试访问子进程时,一次性加载它们,而不是select-n + 1-ing,因为我迭代它们?
我也得到了"无限结果集",这可能是同样的问题(或者更确切地说,如果可能的话,将由上述解决方案解决).
每个子集合(整个图表)将只有大约20个成员,但20 ^ 5很多,所以当我得到root时我不想急于加载所有内容,而只是每当我获取所有子集合时靠近它.
编辑:事后的想法....如果我想在渲染孩子时引入分页怎么办?我是否必须在这里打破我的对象图,或者我可以用一些偷偷摸摸来解决所有这些问题?
NHibernate 试图加载一个小的数据层次结构时遇到了问题。我的域模型如下所示:
class GrandParent
{
int ID{get;set;}
IList<Parent> Parents {get; set;}
}
class Parent
{
IList<Child> Children {get; set;}
}
class Child
{
}
Run Code Online (Sandbox Code Playgroud)
我想为给定的祖父母加载所有父母和孩子。这个 Linq-to-NH 查询创建了正确的 SQL 并按预期加载了 GrandParent:(该示例假设祖父母有 2 个父母,每个父母都有 2 个子对象 - 所以总共有 4 个子对象)。
var linq = session.Linq<GrandParent>();
linq.Expand("Parents");
linq.Expand("Parents.Children");
linq.QueryOptions.RegisterCustomAction(c =>
c.SetResultTransformer(new DistinctRootEntityResultTransformer()));
var grandparent = (select g from session.Linq<GrandParent>()
where g.ID == 1
select g).ToList();
Assert(grandparent.Count == 1); //Works
Assert(grandparent.Parents.Count == 2); //Fails - count = 4!
Run Code Online (Sandbox Code Playgroud)
Grandparent.Parents 集合包含 4 个项目,其中 2 个是重复的。似乎 DistinctRootEntityResultTransformer …