Вопрос

Я ищу способ превратить или оператор в запрос, чтобы найти определенное значение в одном поле таблицы, а также в другом поле соединенной таблицы. Это довольно просто в SQL, но я не могу понять, как сделать это в Nhibernate. Я искал в Интернете, но примеры, которые я нахожу, довольно туманные для меня, и мне трудно применить к моей конкретной реализации.

У меня есть класс, называемый партией, с струнным полем, называемым ссылкой, который является основной ссылкой. Новые требования потребовали возможности также добавить много побочных ссылок на сторону. Поэтому мне пришлось добавить еще один класс под названием PartyReference, который имеет отношение к одному к одному.

Теперь с данной ссылкой, я должен посмотреть его значение как в этом основном эталонном поле, так и среди побочных ссылок. Но до тех пор, пока я не могу понять, чтобы сказать Nhibernate, что либо это поле должно соответствовать значению, либо одному из других, я не могу заставить его работать.

Я сделал обходной путь, который выглядит так, но он неэлеганский и глупый, так как должен быть способ сказать «или»:

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

Я, конечно, понимаю, что могу также решить эту проблему, просто удалив основную ссылку из партийного класса Alltogether и относиться к ней на одном уровне с другими ссылками, как партийные. Но на каком -то этапе мне все равно придется использовать или запрос с Nhibernate, так что я мог бы так же хорошо решить его с этим конкретным случаем.

Любые идеи?

Это было полезно?

Решение

Вы можете использовать Restrictions.Or или используйте дизъюнкцию для нескольких или.

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>();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top