C # + Castle ActiveRecord: HasAndBelongsToMany e coleções
-
02-07-2019 - |
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!
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.