相关疑难解决方法(0)

Linq for NHibernate和fetch模式的急切加载

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

linq nhibernate eager fetch

44
推荐指数
3
解决办法
2万
查看次数

防止Fluent NHibernate选择n + 1

我有一个相当深的对象图(5-6个节点),当我遍历它的部分时,NHProf告诉我我有一个"选择N + 1"问题(我这样做).

我所知道的两个解决方案是

  1. 渴望加载孩子
  2. 分解我的对象图(和急切的负载)

我真的不想做这些中的任何一个(虽然我可能会稍后将图表分开,因为我预测它会增长)

目前....

是否有可能告诉NHibernate(使用FluentNHibernate)每当我尝试访问子进程时,一次性加载它们,而不是select-n + 1-ing,因为我迭代它们?

我也得到了"无限结果集",这可能是同样的问题(或者更确切地说,如果可能的话,将由上述解决方案解决).

每个子集合(整个图表)将只有大约20个成员,但20 ^ 5很多,所以当我得到root时我不想急于加载所有内容,而只是每当我获取所有子集合时靠近它.

编辑:事后的想法....如果我想在渲染孩子时引入分页怎么办?我是否必须在这里打破我的对象图,或者我可以用一些偷偷摸摸来解决所有这些问题?

nhibernate select fluent-nhibernate

5
推荐指数
1
解决办法
4403
查看次数

急切地在 NHibernate 中加载 child 和 child-of-child 集合

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 …

c# nhibernate linq-to-nhibernate eager-loading

5
推荐指数
1
解决办法
2099
查看次数