Frage

eine Klasse A im Zusammenhang mit einer anderen Klasse B in einer Beziehung eins-zu-viele gegeben, wie kann man eine NHibernate-Abfrage zu erstellen (unter Verwendung der Kriterien API - keine HQL) finden all A-Objekte, die „keine haben“ von der bezogene Objekte B? Besonderheiten folgen, aber ich wollte die Frage dort zuerst bekommen.

Ich habe zwei Modellklassen, Beispiel: und SampleDiagnosis . Probe hat eine Diagnosen Eigenschaft, die eine ISET . SampleDiagnosis hat eine Besitzer Eigenschaft, die auf die Probe verbindet zurück. Es ist eine einfache Eins-zu-viele-Beziehung.

Der entsprechende Abschnitt meiner Beispiel NHibernate-Mapping-Datei sieht wie folgt aus:

<set name="Diagnoses" table="sample_diagnoses" cascade="all-delete-orphan" inverse="true">
  <key column="sample_id" />
  <one-to-many class="SampleDiagnosis" />
</set>

Das entsprechende Stück der SampleDiagnosis Mapping-Datei wie folgt aussieht:

<many-to-one name="Owner" class="Sample" column="sample_id" />

Ich versuche, eine NHibernate ICriteria Abfrage zu erstellen, die Proben übereinstimmen, die alle Elemente nicht haben in ihren Diagnosen Liste. Hier ist der Code Ich bin mit meiner Test-Abfrage zu erstellen:

var dc = DetachedCriteria.For<Sample>();

var subcriteria = dc.CreateCriteria("Diagnoses").SetProjection(Projections.RowCount());

dc.Add(Subqueries.Eq(0, subcriteria));

In meinem Kopf, die SQL für diese erzeugt in etwa wie folgt aussehen:

SELECT * FROM samples WHERE (select count(*) from sample_diagnoses where sample_diagnoses.sample_id = samples.sample_id) = 0

Wenn jedoch tatsächlich eine GetExecutableCriteria tun () und List () die Ergebnisse ing, mein Code stürzt ab. Hart. Es sind keine Ausnahmen geworfen, aber was auch immer passiert ist, den Code zu laufen (sei es NUnit oder w3p.exe) stirbt einen schrecklichen Tod. Ich habe es auf mehreren Rechnern versucht, alle mit dem gleichen Ergebnis. Ich habe das Gefühl, mir fehlt etwas entscheidend darüber, wie Unterabfragen arbeiten mit Sätzen in NHibernate.

War es hilfreich?

Lösung 2

Es stellte sich heraus, was ich suchte war Expression.IsEmpty ( "Diagnosen") .

Andere Tipps

Dies wäre SO viel einfacher über HQL - gerade Sayin :)

Haben Sie versucht size mit? So etwas wie:

var dc = DetachedCriteria.For<Sample>();
dc.Add(Expression.sizeEq("Diagnoses", 0) );
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top