2010-07-21 21 views
9

tengo las siguientes clases asignadasNhibernate o criterios de consulta

Trade { ID, AccountFrom, AccountTo } 
Account {ID, Company} 
Company {ID} 

ahora no puedo encontrar una manera de seleccionar todas las rutas en las que

AccountFrom.Company.ID = X OR AccountTo.Company.ID = X 

que puedo conseguir y trabajar utilizando la siguiente:

criteria.CreateCriteria("AccountFrom").CreateCriteria("Company").Add(Restrictions.Eq("ID", X); 
criteria.CreateCriteria("AccountTo").CreateCriteria("Company").Add(Restrictions.Eq("ID", X); 

Pero, ¿cómo puedo transformar esto en un O sino en un Y? He utilizado Disjunction anteriormente, pero parece que no sé cómo agregar criterios separados, solo restricciones.

+1

debería leer AccountFrom.Company.ID = X O AccountTo.Company.ID = X ?? ya que su pregunta no tiene sentido ya que es – Rippo

+0

Opps, sí su correcta –

Respuesta

23

Probar:

return session.CreateCriteria<Trade>() 
    .CreateAlias("AccountFrom", "af") 
    .CreateAlias("AccountTo", "at") 
    .Add(Restrictions.Or(
     Restrictions.Eq("af.Company.CompanyId", companyId), 
     Restrictions.Eq("at.Company.CompanyId", companyId))) 
    .List<Trade>(); 

No creo que necesite alias Company.

+0

Ahh gracias, usted tiene que crear alias primero! Dejase' lo sé. Gracias –

5

Creo que las opciones de NHibernate dependen de la versión de NHibernate que esté utilizando.

disyunción = O, Y = Conjunción

.Add(
    Expression.Disjunction() 
    .Add(companyId1) 
    .Add(companyId2) 
) 

Igual que esta pregunta here


Jamie Ide simplemente respondió más a fondo ... la esencia de la misma dice así:

.Add(Restrictions.Or(
    Restrictions.Eq("object1.property1", criteriaValue), 
    Restrictions.Eq("object2.property3", criteriaValue)) 
+0

¿Pero cómo agrego objetos anidados? No necesito restricciones en una sola propiedad, necesito un OR entre 2 propiedades diferentes (en 2 subclases diferentes) –

+0

Lamento no haber dado detalles ... 'Jamie Ide' solo lo hizo. Eso debería ser lo que quieres, y lo que debería haber dicho. .Add (Restrictions.Or ( Restrictions.Eq ("object1.property1", criteriaValue), Restrictions.Eq ("object2.property3", criteriaValue)) –

3

Usando Linq a NHibernate:

var X = 0; // or whatever the identifier type. 
var result = Session.Linq<Trade>() 
       .Where(trade => trade.AccountFrom.Company.ID == X || 
           trade.AccountTo.Company.ID == X) 
       .ToList(); 

Usando HQL:

var X = 0; // or whatever the identifier type. 
var hql = "from Trade trade where trade.AccountFrom.Company.ID = :companyId or trade.AccountTo.Company.ID = :companyID"; 
var result = Session.CreateQuery(hql) 
       .SetParameter("companyId", X) 
       .List<Trade>(); 
Cuestiones relacionadas