Pergunta

Digamos que eu tenho muitos-para-muitos relação (usando o atributo HasAndBelongsToMany ActiveRecord) entre Mensagens e Etiquetas (nomes de objetos de domínio alterado para proteger os inocentes), e eu queria um método como

FindAllPostByTags(IList<Tag> tags)
que retorna todos os posts que tem tudo (e não apenas algumas) das Etiquetas nas parâmetro. Qualquer maneira que eu poderia fazer isso tanto com NHibernate expressões ou HQL? Eu procurei a documentação HQL e não foi possível encontrar nada adequado as minhas necessidades. Espero que eu apenas estou faltando algo óbvio!

Foi útil?

Solução

Você também pode apenas usar uma instrução IN

DetachedCriteria query = DetachedCriteria.For<Post>();
query.CreateCriteria("Post").Add(Expression.In("TagName",  string.Join(",",tags.ToArray()) );

Eu não tenho compilado que por isso poderia ter erros

Outras dicas

Eu não tenho um sistema à mão com um castelo instalar agora, então eu não testar ou compilar isso, mas o código abaixo deve cerca de fazer o que quiser.

Junction c = Expression.Conjunction();
foreach(Tag t in tags)
    c = c.Add( Expression.Eq("Tag", t);

return sess.CreateCriteria(typeof(Post)).Add(c).List();

Eu apenas tive o mesmo problema e tentou ler o HQL-documentação, no entanto algumas das características não parece ser implementado em NHibernate (com palavras-chave, por exemplo)

Acabei com esse tipo de solução:

select p 
FROM Post p
JOIN p.Tags tag1
JOIN p.Tags tag2
WHERE
    tag1.Id = 1
    tag2.Id = 2

Ou seja, criar dinamicamente a HQL usando join para cada tag, em seguida, fazer a seleção em sua cláusula WHERE. Isso funcionou para mim. Eu tentei fazer a mesma coisa com um DetachedCriteria mas teve problemas ao tentar se juntar à mesa várias vezes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top