ISet< T>を使用したNHibernate ICriteriaサブクエリプロパティ:これは正しいですか?

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

質問

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) );
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top