1 対多の関係で別のクラス B に関連するクラス A が与えられた場合、どのように NHibernate クエリを作成して (基準 API を使用し、HQL なしで)、関連するオブジェクト B を「持たない」すべてのオブジェクト A を見つけることができますか? ? 詳細は次のとおりですが、最初に質問をしたいと思いました。
SampleとSampleDiagnosisの 2 つのモデル クラスがあります。サンプルには、ISet<SampleDiagnosis> であるDiagnosesプロパティがあります。SampleDiagnosis には、サンプルにリンクするOwnerプロパティがあります。これは単純な 1 対多の関係です。
サンプル 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() を実行して結果を List() すると、コードがクラッシュします。難しい。例外はスローされませんが、たまたまコードを実行していたもの (NUnit であれ w3p.exe であれ) は恐ろしい死を迎えます。複数のマシンで試しましたが、すべて同じ結果でした。サブクエリが NHibernate のセットでどのように機能するかについて、重要な何かが欠けていると感じています。