سؤال

أنا أبحث عن طريقة لبناء أو مشغل في استعلام للبحث عن قيمة معينة في حقل واحد من الجدول وكذلك في حقل آخر من الجدول المرتبط. هذا أساسي جدًا في SQL ، لكن لا يمكنني معرفة كيفية القيام بذلك في Nhibernate. لقد كنت أبحث عن الويب ، لكن الأمثلة التي أجدها غامضة جدًا بالنسبة لي وأجدهم يصعب تطبيقها على تنفيذي الخاص.

لدي فصل يسمى Party ، مع مجال سلسلة يسمى المرجع ، وهو المرجع الرئيسي. طالبت المتطلبات الجديدة خيار القدرة أيضًا على إضافة الكثير من المراجع الجانبية إلى الطرف. لذلك اضطررت إلى إضافة فصل آخر يسمى 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