2010-06-08 5 views
0

Je suis coincé avec une requête que j'ai besoin d'écrire.HQL sur carte ternaire avec sous-collection

Compte tenu du modèle suivant:

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; } 
} 

je dois obtenir une liste des A instances qui ont un D contenant des données pour spécifié B (paramètre)

Dans le modèle d'objet, qui serait être:

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

Mais je n'étais pas capable d'écrire un HQL qui fonctionne.

Je suis capable d'écrire quelque chose comme ce qui suit, qui filtre le C.Data1:

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

Mais je suis incapable de faire quoi que ce soit avec les éléments de aC [: b] .D (I obtenir diverses exceptions d'analyse syntaxique)

Voici les correspondances, au cas où vous êtes intéressé (rien de spécial, généré par Comforme):

<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> 

Merci!

Répondre

0

Eh bien, il semble que je devais juste essayer plus dur :-)

J'ai fait la relation entre B et C bidirectionnelle, donc je peux écrire le HQL suivant:

from A a, D d 
where a.C[:b] = d.C 
and d.Data2 = 0