Nhibernate 3 Linq - внутренние соединения - PullRequest
5 голосов
/ 25 ноября 2010

Я тестирую nhibernate 3 CR, но не могу создать следующий SQL с помощью 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?

Ответы [ 2 ]

6 голосов
/ 25 ноября 2010

Во-первых, определите отношения в вашей модели, а не пытайтесь присоединиться по идентификатору.

Тогда вы сможете сделать это:

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

Все, что не хватает, - это порядок, который я не считаю правильным (вы пытаетесь упорядочить по совокупности, но не указываете группу по)

4 голосов
/ 25 ноября 2010

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();
...