Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nhibernate 为查询版本定义子选择_Nhibernate_Queryover - Fatal编程技术网

Nhibernate 为查询版本定义子选择

Nhibernate 为查询版本定义子选择,nhibernate,queryover,Nhibernate,Queryover,我确信我遗漏了一些非常明显的东西。 我想说的很简单- 我希望通过一个查询加载所有用户s,而不会使他们的帖子和追随者集合水合。 在另一个查询中,我确实希望使用SubSelect初始化这些集合 在第二个查询中使用Fetch(…)将发出左连接,这是我不想要的。 我可以像这样(流利地)在映射中定义这些集合的获取策略: 这将导致第二个查询按我希望的方式运行,但是我无法关闭第一个查询的.Not.LazyLoad()(我尝试了.Fetch(u=>u.Posts)。Lazy,但这似乎没有任何作用) 我缺少什么?

我确信我遗漏了一些非常明显的东西。
我想说的很简单-

我希望通过一个查询加载所有
用户
s,而不会使他们的
帖子
追随者
集合水合。
在另一个查询中,我确实希望使用SubSelect初始化这些集合

在第二个查询中使用
Fetch(…)
将发出左连接,这是我不想要的。
我可以像这样(流利地)在映射中定义这些集合的获取策略:

这将导致第二个查询按我希望的方式运行,但是我无法关闭第一个查询的
.Not.LazyLoad()
(我尝试了
.Fetch(u=>u.Posts)。Lazy
,但这似乎没有任何作用)


我缺少什么?

我通常在映射(Ayende)中设置
lazy=true
,因为我更喜欢控制代码中的行为

这样做,只有在你需要的时候,你的联想才会被补充水分

var users = session.QueryOver<User>()
    .List();
如果您想加载一些用户及其帖子,只需执行以下操作:

Post posts = null;

var users = session.QueryOver<User>()
    .Where(x => x.Name == "Jamie")
    .Inner.JoinAlias(t => t.Posts, () => posts)
    .List();

你可以找到更多的信息。

我最近对这些课题做了大量研究,我想我可能会有所帮助。您想使用subselect有什么特别的原因吗?这似乎是最好的选择,从性能角度来看。每个用户都有很多帖子,所以我不想用
Join
获得笛卡尔积,我也有很多用户,所以我不想用
select
获得N+1选择。有一些技巧可以避免笛卡尔积。我将尝试用一个正确的答案来回答。有趣的是,如果在映射中使用subselect获取策略,则在延迟加载的情况下可以获得所需的行为,但使用.Eager on the query over仍然会迫使您加入。(与criteria API不同,criteria API在将fetch mode设置为eager/select时似乎保留了您的映射首选项)使用
Inner
似乎是一个很好的方向,生成的SQL确实是我想要的。但是问题是
Posts
集合没有初始化。含义-在调用示例中的代码后,
NHibernateUtil.IsInitialized(user.Posts)
评估为
false
。即使我向查询中添加
.Fetch(x=>x.Posts).Eager
。知道为什么吗?@sjonny:我已经尝试了NHibernateUtil.I,在我的示例代码中初始化,它工作正常。你能发布一些代码/hbm吗?是的,你是对的。我的问题是我有一个抽象类型的集合。我问了另一个更具挑战性的问题@Sjonny:我一有时间就来看看你的问题。
var postTitle = users[0].Posts[0].Title;
Post posts = null;

var users = session.QueryOver<User>()
    .Where(x => x.Name == "Jamie")
    .Inner.JoinAlias(t => t.Posts, () => posts)
    .List();
Post posts = null;

var users = session.QueryOver<User>()
    .Where(x => x.Name == "Jamie")
    .Inner.JoinQueryOver(t => t.Posts, () => posts)
    .List();
var users = session.QueryOver<User>()
    .Where(x => x.Name == "Jamie")
    .Fetch(x=>x.Posts).Eager
    .List();
Post posts = null;

var users = session.QueryOver<User>()
    .Where(x => x.Name == "Jamie")
    .Inner.JoinAlias(t => t.Posts, () => posts)
    .TransformUsing(Transformers.DistinctRootEntity)
    .List();