LINQ to NHibernate, как сделать этот запрос - PullRequest
3 голосов
/ 30 января 2012

У меня есть две сущности, EntityA и EntityB.EntityB в базе данных имеет ссылку FK на EntityA.Id, поэтому для каждой строки в 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-to-NHibernate испускал, выглядит примерно так:

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

Любая помощь, которую кто-либо может оказать, очень ценится, спасибо.

1 Ответ

1 голос
/ 30 января 2012

Проще установить двустороннюю связь между EntityA и EntityB.(Извините, NHForge сейчас недоступен, в противном случае я бы связал вас с некоторыми документами).

Затем вы можете написать запрос следующим образом:

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

Делать это без двунаправленного отображенияв Linq сложно - я бы использовал CreateCriteria или HQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...