NHibernate ICriteria الاستعلامات الفرعية مع ايست<T> خصائص:هل هذا صحيح ؟

StackOverflow https://stackoverflow.com/questions/1220179

سؤال

بالنظر إلى فئة ذات الصلة إلى آخر فئة ب في واحد لكثير العلاقة ، كيف يمكنك إنشاء 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) );
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top