具有ISet <t>属性的NHibernate ICriteria子查询:这是正确的吗?</t>

时间:2009-08-02 23:35:11

标签: c# .net nhibernate criteria subquery

鉴于A类与一对多关系中的另一个B相关,如何创建一个NHibernate查询(使用Criteria API - 无HQL)来查找所有对象A“没有”相关对象B?具体细节如下,但我想首先提出问题。

我有两个模型类,样本 SampleDiagnosis 。样本具有诊断属性,该属性是ISet&lt; SampleDiagnosis&gt;。 SampleDiagnosis有一个 Owner 属性,它链接回样本。这是一个简单的一对多关系。

我的Sample 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查询,该查询将匹配 Diagnoses 列表中没有任何项目的示例。这是我用来构建测试查询的代码:

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 个答案:

答案 0 :(得分:1)

通过HQL更容易 SO - 只是说':)

您尝试使用size了吗?类似的东西:

var dc = DetachedCriteria.For<Sample>();
dc.Add(Expression.sizeEq("Diagnoses", 0) );

答案 1 :(得分:1)

事实证明,我所寻找的是 Expression.IsEmpty(“诊断”)