2010-11-25 11 views
5

estoy probando nhibernate 3 CR, pero no puede crear el siguiente código SQL utilizando LINQ:Nhibernate 3 LINQ - combinaciones internas

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; 

no he conseguido hasta ahora, mi código actual es así y da algo completamente diferente:

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; 

¿Hay algún recurso sobre cómo utilizar las uniones internas con linq? ¿Y qué debo hacer con:

order by count(release.Status) 

¿Esto es algo que debería hacerse con QueryOver?

+1

¿Por qué define relaciones entre entidades en las consultas en lugar de en la asignación? – Paco

+0

Estaba probando linq en una aplicación heredada. Así que así es como se veía el SQL. Puedo oler una reescritura de las asignaciones, pero el punto aquí fue ver hasta dónde había evolucionado Linq a nhibernate. Y parece que no es muy útil. – bondehagen

Respuesta

4

AFAIK, NH todavía no es compatible con las uniones en linq. Así que es mejor usar HQL, o incluso QueryOver (creo que para consultas simples es el mejor). Mire este ejemplo:

// 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

Primero, defina las relaciones en su modelo en lugar de intentar unir por id.

Entonces serás capaz de hacer esto:

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

Lo único que falta es la orderby, que no creo que sea correcto (que está intentando realizar un pedido por un agregado, pero eres no especificando un grupo por)

+0

Esto causa una combinación externa implícita y no es efficeint como unión interna –

+0

@Saeed: muéstreme una sesión de creación de perfiles que demuestre que es relevante. –

+0

No vi actualmente, pero sé cómo funciona. –

Cuestiones relacionadas