Bei einer Klasse A, die sich auf eine andere Klasse B in einer Eins-zu-viele-Beziehung bezieht, können Sie eine NHibernate-Abfrage (mithilfe der Kriterien-API - keine HQL) erstellen, um alle Objekte A zu finden, die keine der verwandten Klasse haben Objekte B? Besonderheiten folgen, aber ich wollte zuerst die Frage da draußen bekommen.NHibernate ICriteria Unterabfragen mit ISet <T> Eigenschaften: Ist das korrekt?
Ich habe zwei Modellklassen, Probe und SampleDiagnosis. Die Probe hat eine Diagnosen Eigenschaft, die ein ISet <SampleDiagnosis> ist. SampleDiagnosis hat eine Owner Eigenschaft, die zurück zu der Probe verknüpft. Es ist eine einfache Eins-zu-Viele-Beziehung.
Der entsprechende Abschnitt meiner Beispieldatei NHibernate Mapping wie folgt aussieht:
<set name="Diagnoses" table="sample_diagnoses" cascade="all-delete-orphan" inverse="true">
<key column="sample_id" />
<one-to-many class="SampleDiagnosis" />
</set>
Der entsprechende Teil der Datei SampleDiagnosis Mapping wie folgt aussieht:
<many-to-one name="Owner" class="Sample" column="sample_id" />
ich eine NHibernate zu schaffen versuchen ICriteria Abfrage, die Stichproben, die keine Elemente in ihrer Diagnosen Liste übereinstimmen. Hier ist der Code verwende ich zu meinem 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 würde 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, mein Code stürzt ab. Hart. Es werden keine Ausnahmen ausgelöst, aber was auch immer passiert, um den Code auszuführen (sei es NUnit oder w3p.exe) stirbt einen schrecklichen Tod. Ich habe es auf mehreren Maschinen versucht, alle mit dem gleichen Ergebnis. Ich habe das Gefühl, dass mir etwas Entscheidendes fehlt, wie Unterabfragen mit Sets in NHibernate funktionieren.
Leider ist SizeEq Teil von Hibernate, aber nicht NHibernate!). Sie haben mich jedoch dazu inspiriert, zurückzugehen und die API genauer zu untersuchen, und Expression.IsEmpty ("Diagnosen") funktioniert. – Matt
In der Tat habe ich diesen Trick mit Hibernate abgeholt :-) Ich wusste für eine Tatsache, dass 'Größe' Funktion in NHibernate HQL funktioniert, war aber nicht sicher über Kriterien. Ich bin froh, dass du es herausgefunden hast. – ChssPly76