2012-08-28 78 views
2

我試圖讓nhibernate在渴望獲取中使用別名。林不知道它可能。Nhibernate QueryOver在Eager Fetch中使用別名

我想在我的提取中使用別名(在我的例子中是bAlias)。

QueryOver<A>() 
.JoinAlias(x => x.B,() => bAlias) 
.JoinAlias(x => x.B,() => bAlias2) 
.Where(() => bAlias2.Surname == "Smith") 
.Fetch(() => bAlias).Eager 
.Fetch(() => bAlias.C).Eager; 

正如你所看到的,fetch命令使用2個別名而不是直接路徑。

上述代碼無效。可以工作的代碼是

QueryOver<A>() 
.JoinAlias(x => x.B,() => bAlias) 
.JoinAlias(x => x.B,() => bAlias2) 
.Where(() => bAlias2.Surname == "Smith") 
.Fetch(x => x.B).Eager 
.Fetch(x => x.B.C).Eager; 

正如您所看到的,它的Fetch語句不同。

+0

爲什麼您需要使用'JoinAlias'中的別名? –

回答

3

嘗試這樣:

B b = null; 

QueryOver<A>() 
    .Fetch(x => x.B).Eager 
    .JoinAlias(x => x.B,() => b, JoinType.LeftOuterJoin); 
+0

很好的答案。另外,這裏有關於別名的官方文檔的鏈接:http://nhforge.org/doc/nh/en/index.html#queryqueryover-aliases –

0

你可以只使用一個連接來代替,Fetch解析爲 INNER JOIN LEFT OUTER JOIN反正。

QueryOver<A>() 
    .JoinAlias(x => x.B,() => bAlias) 
    .Where(() => bAlias.Surname == "Smith") 
    .Fetch(x => x.B).Eager 
    .JoinQueryOver(() => bAlias.C) 
+0

我想通過「INNER JOIN」你的意思是「左外連接」? ;)例如:https://gist.github.com/Meligy/877532 –

+1

@buli - 是的,謝謝,我更正了答案 – Shagglez