1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

NHibernate e QueryOver

Fala pessoal!

Seguinte. Estou com um probleminha em um projeto. Utilizo NHibernate e tenho um repositório genérico muito simples. No método onde busco algo no banco segundo uma determinada expressão, faço apenas isso:

_session.QueryOver<T>().Where(expression).List().ToList<T>();

O problema começou quando precisei incrementar meu filtro a partir de dados de um relacionamento. Exemplo: Contrato pertence a um cliente; trazer todos os contratos do cliente cujo CPF é 123, o que gera algo do como Contratos.Cliente.CPF == 123.

Comecei a tomar um erro nessa consulta, coisa que não acontecia quando, no lugar do CPF, eu buscava pelo Id. Algo como: Contratos.Cliente.Id = 20. Pesquisando um pouco, encontrei algumas informações no site do NHibernate e vi que eu deveria utilizar o JoinQueryOver e explicitar as minhas relações (mesmo que já estejam declaradas no mapeamento). Segue um trecho de código retirado do site oficial:

IQueryOver<Cat,Kitten> catQuery =
    session.QueryOver<Cat>()
        .JoinQueryOver(c => c.Kittens)
            .Where(k => k.Name == "Tiddles");

Ref: http://nhforge.org/blogs/nhibernate/archive/2009/12/17/queryover-in-nh-3-0.aspx

Bom, até ai tudo tranquilo, mas no meu caso que utilizo um repositório genérico, isso seria complicado. A consulta no método do meu repositório genérico é algo como:

var contratos = repo.ListarPor(x => x.Cliente.Email == "joao@dominio.com.br");

A solução que me veio a cabeça era colocar um segundo parâmetro no método passando uma lista de membros do meu objeto, os quais eu desejo fazer o join e depois resolver isso internamente no método da consulta, algo como:

var contratos = repo.ListarPor(x => x.Cliente.Email == "joao@dominio.com.br", joins => {joins.Cliente; joins.Status});

Minha segunda ideia foi obter todos os membros citados na expressão e extrair apenas aqueles que estendem da minha entidade base, e então incluí-los no join.

Mas não sei sequer por onde começar.

Podem dar uma força?

Muito obrigado!

  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

0 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags .net hibernate ou faça a sua própria pergunta.