好的我正在尝试在我的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)等时它仍会产生连接!
先谢谢了,
乔恩
答案 0 :(得分:0)
尝试将此作为查询的结尾。
.TransformUsing(new DistinctRootEntityResultTransformer())
.SingleOrDefault();
或
.TransformUsing(new DistinctRootEntityResultTransformer())
.List();
并访问第一项。
答案 1 :(得分:0)
你不能这样做。 NHibernate不会为集合发出单独的查询。因此,当您只处理根目录下的单个集合时,查询集合很容易。
您可以使用CreateMultiCriteria()创建单独的查询,并将它们转换为单个结果。
或者我相信你也可以在每个查询上使用.Future(),以便将它们一起批处理,NH将使用第一级缓存来获取集合。