2009-08-25 21 views
10

Tengo una relación padre/hijo asignada con un conjunto de muchos a muchos.NHibernate Criteria Collection Contiene

public class Parent 
{ 
    public ISet<Child> Children { get; set; } 
} 

public class Child {} 

public class ParentMap : ClassMap<Parent> 
{ 
    HasManyToMany(x => x.Children) 
     .AsSet(); 
} 

¿Cómo puedo escribir una consulta para seleccionar todos los elementos principales que contienen un elemento secundario dado? Me hubiera adivinado que sería algo como esto, pero no existe esta API:

Session.CreateCriteria<Parent>() 
    .Add(Expression.Contains("Children", child) 
    .List<Parent>(); 

no puedo por la vida de mí encontrar la respuesta en cualquier lugar. Mi cerebro no funciona completamente hoy y Google me ha fallado hasta ahora.

Respuesta

9

¿Qué tal algo así?

Session.CreateCriteria<Parent>() 
    .CreateCriteria("Children") 
    .Add(Expression.Eq("Id", child.Id) 
    .List<Parent>(); 

o

Session.CreateCriteria<Parent>() 
    .CreateCriteria("Children") 
    .Add(Expression.In("Id", child.Id) 
    .List<Parent>(); 

lo que puede pasar en una matriz de ID.

+0

Ya, pensé en eso, pero algo sobre la comparación de ID en NHibernate parece incorrecto. Sé que es estético, por lo que me gustaría saber si hay otra forma. –

+0

¿Por qué está mal? El propósito de Id es identificar de manera única sus objetos en el DB. – RKitson

+1

Bueno, así es, el objetivo de la identificación es decirle a * NHibernate * cómo identificar de manera única mis entidades para que pueda tratar con los objetos. Si Child fuera una relación unaria de Parent, diría Expression.Eq ("Child", child) y no diría nada sobre la identificación. Sé que estoy siendo quisquilloso aquí, me imaginé que existía algo en la API de Criteria para Contener y que podría usarse como todas las demás comparaciones de entidades. –