LINQ给NHibernate,如何做这个查询

本文关键字:何做这 查询 NHibernate LINQ | 更新日期: 2023-09-27 18:21:55

我有两个实体,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查询。我希望EntityA的所有行在EntityB中没有任何具有对EntityA的外键引用的行。

根据我发现的其他例子,我尝试过这样的东西:

var results = 
                nhSession.Query<EntityA>()
                .Where(x => !x.EntityBs.Any()).ToList();

我想让LINQ到NHibernate发射的东西是这样的:

SELECT 
   id, 
   column1, 
   column2,
   etc..
FROM EntityA 
WHERE id NOT IN (
   SELECT entityAId
   FROM EntityB
)

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

LINQ给NHibernate,如何做这个查询

如果在EntityA和EntityB之间建立双向关系,会更容易。(抱歉,NHForge目前已关闭,否则我会将您链接到一些文档)。

然后你可以这样写查询:

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

在Linq中,在没有双向映射的情况下这样做很困难——我会使用CreateCriteria或HQL。

相关文章: