Domanda

Sto cercando un modo per costruire un operatore OR in una query per cercare un particolare valore in un campo di una tabella, così come in un altro campo di una tabella unita. Questo è piuttosto semplice in SQL, ma non posso per la figura fuori mondo come fare questo in NHibernate. Ho cercato sul web, ma gli esempi che ho trovato sono piuttosto nebulosa a me e io li trovo difficile da applicare al mio particolare implementazione.

Ho una classe chiamata Party, con una stringa-campo chiamato di riferimento, che è il riferimento principale. Nuovi requisiti richiesti la possibilità di essere anche in grado di aggiungere un sacco di fianco riferimenti a una festa. Così ho dovuto aggiungere un'altra classe denominata PartyReference che ha una relazione molti-a-uno per partito.

Ora, con un dato di riferimento devo guardare il suo valore in questo campo, sia di riferimento principale, così come tra i riferimenti laterali. Ma finché non posso calcolare fuori a dire a NHibernate che o questo campo deve corrispondere al valore o uno degli altri, non riesco a farlo funzionare.

Ho fatto una soluzione simile a questa, ma è poco elegante e stupido, come ci deve essere il modo di dire "OR":

   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;
       }

Io naturalmente rendo conto che posso anche risolvere questo problema semplicemente rimuovendo il riferimento principale dalla classe alltogether partito e trattarlo alla pari con gli altri riferimenti, come PartyReference. Ma a un certo punto dovrò usare un OR query con NHibernate comunque, quindi potrei altrettanto bene risolverlo ora con questo caso particolare.

Tutte le idee?

È stato utile?

Soluzione

È possibile utilizzare Restrictions.Or o utilizzare una disgiunzione per multipla o di.

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>();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top