鉴于一个一对多的关系与其他B级A级,你怎么可以创建一个NHibernate的查询(使用标准API - 没有HQL)找到的所有对象谁“有没有”的相关图标B?具体遵循,但我希望得到的问题在那里第一次。

我有两个模型类,的样品和<强> SampleDiagnosis 即可。样品具有诊断属性其是的ISet 。 SampleDiagnosis具有链接回样本的所有者属性。它是一个简单的一对多的关系。

我的样本的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()和列表时()坏的结果,我的代码崩溃。硬。没有引发异常,但无论发生在运行的代码(无论是NUnit的或w3p.exe)死亡一个可怕的死亡。我已经试过了多台机器上,都具有相同的结果。我有一种感觉,我缺少有关如何使用子查询套NHibernate的工作至关重要的东西。

有帮助吗?

解决方案 2

原来,我一直在寻找的是 Expression.IsEmpty( “诊断”)

其他提示

这将是的 SO 经由HQL容易得多 - 只是说:)

您是否尝试过使用size?是这样的:

var dc = DetachedCriteria.For<Sample>();
dc.Add(Expression.sizeEq("Diagnoses", 0) );
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top