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...

Foi útil?

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.

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