Pregunta

He usado nhibernato con fluidez para enganchar una clase de tienda y empleado donde las tiendas pueden tener muchos empleados de la siguiente manera:

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; }
}

Necesito obtener todas las tiendas que tienen empleados que no tengan somestatus1 establecidos en verdadero.

Mi equipo de feo ha fallado:

Session.CreateCriteria(typeof(Store))
    .Add(Restrictions.Not(Restrictions.Eq("Employees.SomeStatus1", true))
    .List<Store>();

¿Alguna idea de cómo voy a hacer eso?

La razón por la que mi intento ha fallado es porque los empleados de la lista no tienen una propiedad de Somestatus1 ... lo cual es bastante obvio.

Lo que no sé, es cómo hacer que Nhibernate solo reciba tiendas que tienen empleados en el estado que estoy buscando ...

Creo que lo que quiero pedirle a Nhibernate es hacer unirse ... pero no sé cómo pedirle que haga eso ...

¿Fue útil?

Solución

Usted se une al crear sub criterios

var criteria = Session.CreateCriteria(typeof(Store));
var join = criteria.CreateCriteria("Employees");
join.Add(Restrictions.Not(Restrictions.Eq("SomeStatus1", true));
return criteria.List<Store>();

Esperanza no es la esperanza de que funcione, pero usted tiene la idea.Así es como lo hago con n: 1 pero tienes 1: n

Editar: OK, hice un poco de investigación después de publicar.Parece que el código que hice debería funcionar, pero causará la carga de la colección de empleados.El mismo código básico se encuentra en el blog de Ayende .Hay una muestra que hace lo mismo sin causar que la colección se vuelva a cargar.Espero que ayude.

Otros consejos

intento:

Session.CreateCriteria(typeof(Store))
.CreateAlias("Employees", "e")
.Add(Restrictions.Not(Restrictions.Eq("e.SomeStatus1", true))
.List<Store>();

Le sugeriría que use la API LINQ a NHIBERNATE en lugar de los criterios API.Con él, su consulta sería la siguiente:

var query = Session.Linq<Store>()
    .Where(store => store.SomeStatus1 != true);

var result = query.ToList();

Más ayuda aquí .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top