Como faço para obter o NHibernate para fazer um join?
-
18-09-2020 - |
Pergunta
Eu usei o Fluent NHibernate para ligar uma loja e classe de funcionários onde as Lojas podem ter muitos empregados da seguinte forma:
public class Store
{
public virtual IList<Employee> Employees { get; set; }
//other store properties
}
public class Employee
{
public virtual Store Store { get; set; }
public virtual bool? SomeStatus1 { get; set; }
}
Eu estou precisando para obter todas as lojas que têm funcionários que não têm SomeStatus1 definida como true.
Meu feable tentativa falhou:
Session.CreateCriteria(typeof(Store))
.Add(Restrictions.Not(Restrictions.Eq("Employees.SomeStatus1", true))
.List<Store>();
Alguma idéia de como eu vou fazer isso?
O motivo de minha tentativa falhou porque a lista de Funcionários não tem uma propriedade de SomeStatus1...o que é bastante óbvio.
O que eu não sei, é como obter o NHibernate para obter apenas lojas que têm empregados no estado que eu estou procurando...
Eu acho que o que eu estou querendo pedir NHibernate é fazer uma associação...mas eu não sei como pedir a ele para fazer isso...
Solução
você junte-se através da criação de sub-critérios
var criteria = Session.CreateCriteria(typeof(Store));
var join = criteria.CreateCriteria("Employees");
join.Add(Restrictions.Not(Restrictions.Eq("SomeStatus1", true));
return criteria.List<Store>();
Não testado (obv) espero que funcione, mas você começa a idéia.É assim que eu faço com ele N:1, mas você tem 1:N
EDITAR:Ok, eu fiz um pouco de pesquisa após a postagem.Parece que o código que eu fiz deve funcionar, mas fará com que o carregamento dos funcionários coleção.O mesmo código básico é encontrado em ayende do blog.Há um exemplo que faz a mesma coisa, sem causar a coleção a ser recarregado.Espero que ajude.
Outras dicas
Tente:
Session.CreateCriteria(typeof(Store))
.CreateAlias("Employees", "e")
.Add(Restrictions.Not(Restrictions.Eq("e.SomeStatus1", true))
.List<Store>();
Sugiro que você use o Linq to NHibernate API em vez de Critérios de API.Com isso, sua pesquisa seria da seguinte forma:
var query = Session.Linq<Store>()
.Where(store => store.SomeStatus1 != true);
var result = query.ToList();
Mais ajuda aqui.