nHibernate QueryOver执行SubSelect加载集合而不是加入

时间:2011-07-12 19:38:38

标签: nhibernate queryover

好的我正在尝试在我的User对象上加载多个到多个集合(Followers,Following,PostLikes,CommentLikes)。但是,当我使用QueryOver对这些集合执行左连接时,它返回的记录数应该多于应该返回的记录。

我使用SQL事件探查器查看了SQL,它似乎不是仅产生4个连接,而是产生8创建一个有点循环的查询。这是我目前的查询。

User userAlias = null;
        User followingAlias = null;
        User followersAlias = null;
        Post postLikesAlias = null;
        Comment commentLikesAlias = null;

        var entity = Session.QueryOver(() => userAlias)
            .Where(x => x.Id == id)
            .Left.JoinAlias(() => userAlias.Followers, () => followersAlias)
            .Left.JoinAlias(() => userAlias.Following, () => followingAlias)
            .Left.JoinAlias(() => userAlias.PostLikes, () => postLikesAlias)
            .Left.JoinAlias(() => userAlias.CommentLikes, () => commentLikesAlias)
            .SingleOrDefault();

        ReleaseCurrentSession();

        return entity;

无论如何,当我没有选择性地加载东西并通过我的流畅映射使用急切加载时。系列完美加载。我再次查看了Sql Profiler,它似乎为每个集合执行单独的select查询。有没有办法使用QueryOver而不是使用连接?我知道在你的映射中你可以指定FetchTypes,但是当我这样做并且只使用.Fetch(x => x.Followers)等时它仍会产生连接!

先谢谢了,

乔恩

2 个答案:

答案 0 :(得分:0)

尝试将此作为查询的结尾。

 .TransformUsing(new DistinctRootEntityResultTransformer())
 .SingleOrDefault();

 .TransformUsing(new DistinctRootEntityResultTransformer())
 .List();

并访问第一项。

答案 1 :(得分:0)

你不能这样做。 NHibernate不会为集合发出单独的查询。因此,当您只处理根目录下的单个集合时,查询集合很容易。

您可以使用CreateMultiCriteria()创建单独的查询,并将它们转换为单个结果。

或者我相信你也可以在每个查询上使用.Future(),以便将它们一起批处理,NH将使用第一级缓存来获取集合。