Pregunta

Estoy buscando una manera de construir un operador en una consulta para buscar un valor particular en un campo de una tabla, así como en otro campo de una tabla unida. Esto es bastante básico en SQL, pero no puedo para el mundo descubrir cómo hacer esto en NHibernate. He estado buscando en la web, pero los ejemplos que encuentro son bastante nebulosos para mí y me resulta difícil aplicar a mi implementación particular.

Tengo una clase llamada fiesta, con un campo de cadena llamado referencia, que es la referencia principal. Los nuevos requisitos exigieron la opción de poder agregar muchas referencias laterales a una fiesta. Así que tuve que agregar otra clase llamada PartyReference que tiene una relación de muchos a uno con el partido.

Ahora, con una referencia dada, tengo que buscar su valor tanto en este campo de referencia principal como entre las referencias secundarias. Pero siempre que no pueda entender decir a Nhibernate que este campo debe corresponder al valor o uno de los otros, no puedo hacer que funcione.

He hecho una solución que se ve así, pero no es elegante y estúpido, ya que tiene que haber una forma de decir "o":

   public Party GetPartyOnAnyReference(string reference)
       {
           Party party;

           ISession session = Factory.OpenSession();
           ITransaction tx = session.BeginTransaction();
           try
           {
               //first search on main reference
               ICriteria criteria1 = session.CreateCriteria(typeof(Party));
               criteria1.Add(Restrictions.Eq("Reference", reference));
               IList<Party> parties1 = criteria1.List<Party>();
               party = parties1.Count > 0 ? parties1[0] : null;

               //then try with side-references
               if (party == null)
               {
                   ICriteria criteria2 = session.CreateCriteria(typeof(Party));
                   criteria2
                           .SetFetchMode("References", FetchMode.Eager)
                           .CreateCriteria("References")
                           .Add(Expression.Eq("Reference", reference));
                   IList<Party> parties2 = criteria2.List<Party>();
                   party = parties2.Count > 0 ? parties2[0] : null;
               }

               session.Close();
           }
           catch (Exception e)
           {
               tx.Rollback();
               session.Close();

               if (e.GetType().ToString() == "NHibernate.ObjectNotFoundException")
                   party = null;
               else throw;
           }
           return party;
       }

Por supuesto, me doy cuenta de que también puedo resolver este problema simplemente eliminando la referencia principal de la clase de fiesta en general y tratarlo a la par con las otras referencias, como una referencia de fiesta. Pero en alguna etapa tendré que usar una consulta o una consulta con NHibernate de todos modos, por lo que bien podría resolverlo ahora con este caso particular.

¿Algunas ideas?

¿Fue útil?

Solución

Puedes usar Restrictions.Or o use una disyunción para múltiples o.

session.CreateCriteria<Party>()
    .CreateAlias("References", "r", JoinType.LeftOuterJoin)
    .Add(Restrictions.Or(
        Restrictions.Eq("Reference", reference),
        Restrictions.Eq("r.Reference", reference)))
    .SetResultTransformer(new DistinctRootEntityResultTransformer())
    .List<Party>();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top