NHibernate的子查询的ICriteria与ISet的属性:这是正确的吗?
-
10-07-2019 - |
题
鉴于一个一对多的关系与其他B级A级,你怎么可以创建一个NHibernate的查询(使用标准API - 没有HQL)找到的所有对象谁“有没有”的相关图标B?具体遵循,但我希望得到的问题在那里第一次。
我有两个模型类,的样品和<强> SampleDiagnosis 即可。样品具有诊断属性其是的ISet
我的样本的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) );
不隶属于 StackOverflow