2010-11-25 72 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 

唯一缺少的是排序依据,我不认为这是正确的(你正在试图通过一个总订货,但你没有指定一个组)