ISet< T>を使用したNHibernate ICriteriaサブクエリプロパティ:これは正しいですか?
-
10-07-2019 - |
質問
1対多の関係で別のクラスBに関連するクラスAが与えられた場合、NHibernateクエリを作成して(基準API-HQLなし)、「何も持たない」すべてのオブジェクトAを見つける方法関連オブジェクトのB?詳細が続きますが、最初に質問を出したいと思いました。
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のセットでサブクエリがどのように機能するかについて、重要な何かを見逃していると感じています。
解決 2
結局のところ、探していたのは Expression.IsEmpty(&quot; Diagnoses&quot;)でした。
他のヒント
これは、HQLを介して SO により簡単になります-と言うだけです:)
size
を使用してみましたか?次のようなもの:
var dc = DetachedCriteria.For<Sample>();
dc.Add(Expression.sizeEq("Diagnoses", 0) );