1

1 対多の関係で別のクラス B に関連するクラス A が与えられた場合、どのように NHibernate クエリを作成して (基準 API を使用し、HQL なしで)、関連するオブジェクト B を「持たない」すべてのオブジェクト A を見つけることができますか? ? 詳細は次のとおりですが、最初に質問をしたいと思いました。

SampleSampleDiagnosisの 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 のセットでどのように機能するかについて、重要な何かが欠けていると感じています。

4

2 に答える 2

1

これは、 HQLを介して非常に簡単になります-ただ言うだけです :)

使ってみましたsizeか?何かのようなもの:

var dc = DetachedCriteria.For<Sample>();
dc.Add(Expression.sizeEq("Diagnoses", 0) );
于 2009-08-03T01:47:55.770 に答える
1

結局のところ、私が探していたのはExpression.IsEmpty("Diagnoses")でした。

于 2009-08-03T15:03:11.483 に答える