LINQ到NHibernate,如何做这个查询

时间:2012-01-30 05:48:13

标签: c# nhibernate .net-4.0

我有两个实体,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
)

非常感谢任何人提供的任何帮助,谢谢。

1 个答案:

答案 0 :(得分:1)

如果在EntityA和EntityB之间建立双向关系,则会更容易。 (对不起,NHForge目前正在关闭,否则我会把你链接到一些文档)。

然后你可以像这样编写查询:

Session.Query<EntityA>
    .Where(x => !x.EntityBs.Any())
    .ToList();

在没有双向映射的情况下执行此操作在Linq中很难 - 我会使用CreateCriteria或HQL。