2010-11-25 73 views
5

我測試了NHibernate的3 CR,但無法使用LINQ創建以下SQL:NHibernate的3 LINQ的 - 內部連接

select * 
    from  Users    as {user} 
    inner join Test    as test on test.UserId = user.Id 
    inner join Release    as release on release.TestId = test.TestId 
    where Release.Status = 1 
    order by count(release.Status) desc; 

我還沒有走到這一步,我現在的代碼是這樣的,並給出我的東西完全不同:

var users = from user in Session.Query<User>() 
      join test in Session.Query<Test>() on user.Id equals test.User.Id 
      join release in Session.Query<Release>() on test.Id equals release.Test.Id 
      where release.Status == 1 
      orderby release.Status 
      descending 
      select user; 

有沒有關於如何使用linq內部連接的任何資源?我應該怎麼做:

order by count(release.Status) 

這是應該用QueryOver來完成嗎?

+1

爲什麼在查詢中定義實體間的關係而不是在映射中? – Paco 2010-11-25 13:14:10

+0

我只是在遺留應用程序上測試linq。所以這就是SQL的樣子。我可以聞到映射的重寫,但這裏的要點是要看看Linq到底有多遠進化了。它看起來不太可用。 – bondehagen 2010-11-26 09:42:27

回答

4

AFAIK,NH仍然不支持linq中的連接。 所以更好地使用HQL,甚至QueryOver(我認爲對於簡單查詢來說它是最好的)。看看這個例子:

// just to assign aliases, not for real use: 
Test qtest = null; 
Release qrel = null; 

// do query 
var data = Session.QueryOver<User>() 
    .JoinAlias(quser => quser.Tests,() => qtest) 
    .JoinAlias(quser => quser.Releases,() => qrel) 
    .Where(() => qrel.Status == 1) 
    .OrderBy(() => qrel.Status).Desc 
    .List(); 
6

首先,在你的模型中定義關係,而不是試圖通過id連接。

然後你就可以做到這一點:

from release in session.Query<Release>() 
where release.Status == 1 
select release.Test.User 

唯一缺少的是排序依據,我不認爲這是正確的(你正在試圖通過一個總訂貨,但你沒有指定一個組)