NHibernate ICriteria الاستعلامات الفرعية مع ايست<T> خصائص:هل هذا صحيح ؟
-
10-07-2019 - |
سؤال
بالنظر إلى فئة ذات الصلة إلى آخر فئة ب في واحد لكثير العلاقة ، كيف يمكنك إنشاء NHibernate استعلام (باستخدام معايير API-لا HQL) للعثور على جميع الكائنات من "لا" من الكائنات ذات الصلة ب ؟ تفاصيل متابعة ، ولكن أردت أن تحصل على السؤال هناك أولا.
لدي اثنين من نموذج الطبقات ، عينة و SampleDiagnosis.عينة لديه التشخيص الملكية وهو ايست<SampleDiagnosis>.SampleDiagnosis له مالك الممتلكات التي وصلات إلى العينة.بل هو بسيط واحد لكثير العلاقة.
الفرع ذي الصلة من عينة NHibernate ملف تعيين يبدو مثل هذا:
<set name="Diagnoses" table="sample_diagnoses" cascade="all-delete-orphan" inverse="true">
<key column="sample_id" />
<one-to-many class="SampleDiagnosis" />
</set>
قطعة ذات الصلة من SampleDiagnosis ملف تعيين يبدو مثل هذا:
<many-to-one name="Owner" class="Sample" column="sample_id" />
أنا أحاول خلق NHibernate ICriteria الاستعلام التي سوف تطابق العينات التي ليس لديها أي من البنود في التشخيص قائمة.هنا هو رمز أنا باستخدام لبناء اختبار الاستعلام:
var dc = DetachedCriteria.For<Sample>();
var subcriteria = dc.CreateCriteria("Diagnoses").SetProjection(Projections.RowCount());
dc.Add(Subqueries.Eq(0, subcriteria));
في رأيي, SQL التي تم إنشاؤها لهذا سوف ننظر بشيء من مثل ما يلي:
SELECT * FROM samples WHERE (select count(*) from sample_diagnoses where sample_diagnoses.sample_id = samples.sample_id) = 0
ومع ذلك ، عندما في الواقع القيام GetExecutableCriteria() وقائمة()ing النتائج ، قانون بلدي تعطل.من الصعب.لا يتم طرح الاستثناءات ، ولكن ما حدث أن يتم تشغيل التعليمات البرمجية (سواء كان NUnit أو w3p.exe) يموت الموت الرهيبة.لقد حاولت ذلك على عدة آلات ، مع كل نفس النتيجة.لدي شعور أنا في عداد المفقودين شيء حاسم حول كيفية الاستعلامات الفرعية العمل مع مجموعات في NHibernate.
المحلول 2
اتضح أن ما كنت أبحث عنه كان التعبير.IsEmpty("التشخيصات").
نصائح أخرى
هذا من شأنه أن يكون لذلك أسهل بكثير عن طريق HQL - أقول فقط :)
هل حاولت استخدام size
?شيء من هذا القبيل:
var dc = DetachedCriteria.For<Sample>();
dc.Add(Expression.sizeEq("Diagnoses", 0) );