2010-02-15 22 views
5

Antes de pedir He mirado todos los mensajes pertinentes sobre este temaNHibernate muchos-a-muchos consulta utilizando los criterios del API

también he leído esta entrada del blog: http://ayende.com/Blog/archive/2007/12/23/NHiberante-Querying-Many-To-Many-associations-using-the-Criteria-API.aspx

tengo Equipos y tengo Miembros, hay muchos-a-muchos entre ellos

Básicamente: miembro -> MemberTeam < - equipo

con mi consulta que intenta llegar a todos los miembros que pertenecen al mismo equipo que los miembros preguntó (incluyendo los miembros preguntó)

he creado mis tablas usando FluentHibernate siguiente:

código TeamMap: Código

Id(x => x.ID).GeneratedBy.GuidComb().UnsavedValue("00000000-0000-0000-0000-000000000000"); 

HasManyToMany(x => x.Members) 
    .Table("MemberTeam") 
    .ChildKeyColumn("TeamID") 
    .ParentKeyColumn("MemberID"); 

MemberMap:

Id(x => x.ID).GeneratedBy.GuidComb().UnsavedValue("00000000-0000-0000-0000-000000000000"); 

HasManyToMany(x => x.Teams) 
    .Table("MemberTeam") 
    .ChildKeyColumn("MemberID") 
    .ParentKeyColumn("TeamID"); 

El código hago mi consulta con es:

DetachedCriteria dCriteria = DetachedCriteria.For(typeof(Team), "team") 
    .SetProjection(Projections.Id()) 
    .Add(Property.ForName("team.ID").EqProperty("mt.ID")); 

ICriteria criteria = Session.CreateCriteria(typeof (Member), "member") 
    .CreateAlias("Teams", "mt") 
    .Add(Subqueries.Exists(dCriteria)) 
    .Add(Restrictions.Eq("mt.MemberID", new Guid(memberID))); 

IList<Member> list = criteria.List<Member>(); 

sé que estoy haciendo algo mal, pero no puedo entender lo que su

Cualquier ayuda se agradece

Gracias mucho!

P.S. Mi mapa parece estar bien, puedo guardar objetos muy bien!

Respuesta

4

En virtud de llamar a CreateAlias para la ruta Teams, NHibernate se unirá a las tablas adecuadas para usted. No hay necesidad de hacer la sub consulta de ID de miembros:

var members = session 
    .CreateCriteria<Member>("member") 
    .CreateAlias("Teams", "mt") 
    .List<Member>(); 

Sin embargo, ni siquiera estás usando el alias, por lo que sólo puede ser que prefiera para obtener ansiosamente los equipos:

var members = session 
    .CreateCriteria<Member>("member") 
    .SetFetchMode("Teams", FetchMode.Eager) 
    .List<Member>(); 

Si lo hace, asegúrese de no golpear la base de datos de nuevo cuando acceda a cada Member's Teams colección.

+0

Gracias ... Después de pensar durante horas, llegué a la misma respuesta :) –

Cuestiones relacionadas