我有两个实体,EntityA和EntityB。数据库中的EntityB具有对EntityA.Id的FK引用,因此对于EntityA中的每一行,EntityB中可能存在零行,一行或多行。通常,这被简称为一对多关系。
我有两个实体用NHibernate 3.2映射,如下所示:
<class name="EntityA" table="EntityA">
<id name="Id" type="Guid" column="id">
<generator class="guid.comb" />
</id>
<set name="EntityBs" lazy="false" inverse="true" cascade="all" table="EntityB">
<key column="id" />
<one-to-many class="EntityB" />
</set>
<properties...
</class>
<class name="EntityB" table="EntityB">
<id name="Id" type="Guid" column="id">
<generator class="guid.comb" />
</id>
<many-to-one name="EntityA" class="EntityA" column="entityAId" />
<properties...
</class>
我无法弄清楚如何编写这个LINQ查询。我希望EntityB中没有任何行的EntityA的所有行都具有对EntityA的外键引用。
根据其他例子,我发现我尝试过这样的事情:
var results =
nhSession.Query<EntityA>()
.Where(x => !x.EntityBs.Any()).ToList();
我想要LINQ-to-NHibernate发出的是:
SELECT
id,
column1,
column2,
etc..
FROM EntityA
WHERE id NOT IN (
SELECT entityAId
FROM EntityB
)
非常感谢任何人提供的任何帮助,谢谢。
答案 0 :(得分:1)
如果在EntityA和EntityB之间建立双向关系,则会更容易。 (对不起,NHForge目前正在关闭,否则我会把你链接到一些文档)。
然后你可以像这样编写查询:
Session.Query<EntityA>
.Where(x => !x.EntityBs.Any())
.ToList();
在没有双向映射的情况下执行此操作在Linq中很难 - 我会使用CreateCriteria或HQL。