Nhibernate 3 Linq - 内部连接

bon*_*gen 5 linq nhibernate linq-to-nhibernate

我正在测试nhibernate 3 CR,但无法使用Linq创建以下SQL:

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;
Run Code Online (Sandbox Code Playgroud)

我还没有到目前为止,我目前的代码是这样的,给了我一些完全不同的东西:

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;
Run Code Online (Sandbox Code Playgroud)

有没有关于如何使用linq内连接的资源?我应该怎么做:

order by    count(release.Status)
Run Code Online (Sandbox Code Playgroud)

这是应该用QueryOver完成的吗?

Die*_*hon 6

首先,在模型中定义关系,而不是尝试通过id加入.

然后你就能做到这一点:

from release in session.Query<Release>()
where release.Status == 1
select release.Test.User
Run Code Online (Sandbox Code Playgroud)

所有缺少的是orderby,我认为不正确(你试图通过聚合来订购,但你没有指定一个组)


小智 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();
Run Code Online (Sandbox Code Playgroud)