2012-03-10 11 views
5

Hola a todos los gurús de NHibernate.Restricción en la recopilación con disyunción utilizando NHibernate QueryOver

Dadas estas dos clases:

public class User { 
    long Id; 
    string Name; 
} 

public class Project { 
    long Id; 
    User Owner; 
    IList<User> Managers; 
    ... 
} 

Quisiera hacer una consulta usando QueryOver (sin utilizar criterios alias "cadena mágica"), para obtener todos los proyectos que tienen usuario1 como propietario O como uno de los gerentes.

sé tener por separado:

  • proyectos se tienen usuario1 como Propietario:. Session.QueryOver <> Proyecto >>() Donde (p => p.Owner == usuario1)
  • get como gerente:. session.QueryOver <>() JoinAlias ​​(p => p.Managers,() => gerente) .Where (() => gestor de == usuario1)

pero I don' Sé cómo escribir la disyunción.

Si alguien tuviera una idea, me ayudaría mucho.

Gracias de antemano,

Chris

Respuesta

2

Algo así como: -

User manager = null; 

var query = session 
    .QueryOver<Project>() 
    .JoinAlias(j => j.Managers,() => manager) 
    .Where(w => manager.Name == user1 || w.Owner == user1) 
    .List<Project>(); 

edición para cambiar el filtro de la Name a Id (como OP señaló): -

.Where(w=>manager.Id == user1.Id || w.Owner.Id == user1.Id) 

Edit2 a cambio interior para uso izquierda

.JoinAlias(j => j.Managers,() => manager).left 
+0

Gracias, De hecho tenemos que hacer la igualdad en las ID de los objetos y no en objetos .Where (w => manager.Id == user1.Id || w.Owner.Id == user1.Id) Además, esto no da el resultado esperado porque hace una unión interna entre Proyecto y Usuario, y por lo tanto, no obtiene proyectos que tengan usuario1 como propietario pero que aún no tenga ningún administrador :( – Chris

+0

Lo siento, no estaba 100% seguro de lo que quería filtrar y no mencionó que quería una unión a la izquierda ... – Rippo

+0

No lo siento, no se pudo saber :) .Left.JoinAlias ​​(...) Hizo el truco. Muchas gracias Rippo! – Chris

Cuestiones relacionadas