2010-11-25 3 views
5

Я тестируя NHibernate 3 CR, но не может создать следующий SQL с помощью Linq: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 to nhibernate. И похоже, что это не очень удобно. – 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 

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

Смежные вопросы