HQL над троичной картой с вложенной коллекцией - PullRequest
0 голосов
/ 08 июня 2010

Я застрял с запросом, который мне нужно написать.

Учитывая следующую модель:

public class A : Entity<Guid>
{
    public virtual IDictionary<B, C> C { get; set; }
}

public class B : Entity<Guid>
{
}

public class C : Entity<Guid>
{
    public virtual int Data1 { get; set; }
    public virtual ICollection<D> D { get; set; }
}

public class D : Entity<Guid>
{
    public virtual int Data2 { get; set; }
}

Мне нужно получить список A экземпляров, которые имеют D, содержащий некоторые данные для указанного B (параметр)

В объектной модели это будет:

listOfA.Where(a => a.C[b].D.Any(d => d.Data2 == 0))

Но я не смог написать работающий HQL.

Я могу написать что-то вроде следующего, который фильтрует данные C.Data1:

from A a
where a.C[:b].Data1 = 0

Но я ничего не могу сделать с элементами a.C [: b] .D (я получаю различные исключения при разборе)

Вот сопоставления, если вам интересно (ничего особенного, сгенерированное ConfORM):

<class name="A">
  <id name="Id" type="Guid">
    <generator class="guid.comb" />
  </id>
  <map name="C">
    <key column="a_key" />
    <map-key-many-to-many class="B" />
    <one-to-many class="C" />
  </map>
</class>
<class name="B">
  <id name="Id" type="Guid">
    <generator class="guid.comb" />
  </id>
</class>
<class name="C">
  <id name="Id" type="Guid">
    <generator class="guid.comb" />
  </id>
  <property name="Data1" />
  <bag name="D">
    <key column="c_key" />
    <one-to-many class="D" />
  </bag>
</class>
<class name="D">
  <id name="Id" type="Guid">
    <generator class="guid.comb" />
  </id>
  <property name="Data2" />
</class>

Спасибо!

1 Ответ

0 голосов
/ 08 июня 2010

Что ж, похоже, мне просто пришлось постараться: -)

Я установил соотношение между B и C двунаправленным, поэтому я могу написать следующий HQL:

from A a, D d
where a.C[:b] = d.C
and d.Data2 = 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...