我正在测试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;
我还没有到目前为止,我目前的代码是这样的,给了我一些完全不同的东西:
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完成的吗?
答案 0 :(得分:6)
首先,在模型中定义关系,而不是尝试通过id加入。
然后你就可以做到这一点:
from release in session.Query<Release>()
where release.Status == 1
select release.Test.User
所有缺少的是orderby,我认为它不正确(你试图通过聚合来订购,但你没有指定一个组)
答案 1 :(得分: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();