2010-10-04 14 views
1

Mon modèle d'objet est le suivant:Nhibernate API critères pour un grand nombre à plusieurs

article a beaucoup de balises et une marque peut appartenir à plusieurs articles

Je voudrais exécuter la requête suivante à l'aide de critères .

SELECT * FROM Item item 
WHERE item.Id in (Select it.ItemId from dbo.ItemToTags it where it.Tag_id = 'ONE') 
AND item.Id in (Select it.ItemId from dbo.ItemToTags it where it.Tag_id = 'TWO') 

Signification Je voudrais donner une collection d'étiquettes possibles et fournir tous les éléments qui ont tous ces tags:

J'ai essayé ce qui suit, mais j'obtenir pas:

CreateCriteria<Item>().CreateAlias("Tags", "Tags"); 
if (AndQuery) { 
    foreach(var tag in Tags) 
    { 
     criteria.Add(Subqueries.PropertyEq("Tags.Id", DetachedCriteria.For<Tag>().Add(Restrictions.Eq("Id", tag))             .SetProjection(Projections.Property("Id")))); 
    } 
} 

Répondre

0

Je ne sais pas si votre requête pourrait être traduit par:

SELECT * FROM Item item 
join ItemToTags itt on itt.ItemId = item.Id 
join Tags t on itt.TagId = t.Id 
where t.Id in ('ONE','TWO') 

Si oui, vous devriez être en mesure de le faire t son:

CreateCriteria<Item>().CreateAlias('Tags','t') 
    .Add(Restrictions.In('t.Id',new List<string>{'TWO','ONE'}).List<Item>(); 

C'est en supposant que vous avez la collection balises cartographiés sur l'article.

hth

+0

Merci pour la réponse mais cela me donnerait la relation OR. Je suis à la recherche d'une RELeation ET! C'est pourquoi ma requête contient deux sous-sélections et pas et en! – Patrick