我通常在我的映射中設置lazy=true
(Ayende wrote about it),因爲我更喜歡控制我的代碼中的行爲。
這樣做你的關聯只有在你需要時纔會保溼。
var users = session.QueryOver<User>()
.List();
將加載所有的用戶,但不會加載自己的崗位,除非你訪問集合的元素:如果你想加載一些用戶和自己的崗位上,你可以簡單地做
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();
使用外連接,您不想要的。
上述兩個示例在您的評論中提到了一個問題。 如果你想避免笛卡爾乘積在結果與QueryOver你可以使用.TransformUsing(Transformers.DistinctRootEntity)
:
Post posts = null;
var users = session.QueryOver<User>()
.Where(x => x.Name == "Jamie")
.Inner.JoinAlias(t => t.Posts,() => posts)
.TransformUsing(Transformers.DistinctRootEntity)
.List();
你可以找到更多的信息here。
最近我已經完成了關於這些主題的大量研究,我想我可能會提供幫助。爲什麼要使用子選擇符有什麼特別的理由? – LeftyX
這似乎是最好的選擇,性能明智。每個用戶都有很多帖子,所以不想用'Join'獲得笛卡爾產品,而且我有很多用戶,所以我不想讓你選擇N + 1。 –
有幾個技巧可以避免笛卡爾產品。我會試着回答一個正確的答案。 – LeftyX