2010-02-15 6 views
5

Avant de demander que j'ai regardé tous les messages pertinents sur ce sujetNHibernate Many-to-Many requête en utilisant l'API de critères

J'ai aussi lu ce post de blog: http://ayende.com/Blog/archive/2007/12/23/NHiberante-Querying-Many-To-Many-associations-using-the-Criteria-API.aspx

J'ai équipes et je Membres, il y a beaucoup à plusieurs entre les

en gros: membre -> MemberTeam < - team

Avec ma requête, j'essaie d'obtenir tous les membres qui appartiennent à une même équipe en tant que membre interrogé (y compris membre interrogé)

J'ai créé mes tables suivantes en utilisant FluentHibernate:

Code TeamMap:

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

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

Code MemberMap:

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

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

Le code que je fais ma requête avec est:

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>(); 

Je sais que je fais quelque chose de mal, mais je ne peux pas comprendre ce que son

Toute aide serait appréciée

Merci beaucoup!

P.S. Ma carte semble être bien, je peux sauver des objets très bien!

Répondre

4

En raison de l'appel CreateAlias pour le chemin Teams, NHibernate joindra les tables appropriées pour vous. Il n'y a pas besoin de faire la sous-requête sur les ID membres:

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

Cependant, vous n'êtes même pas en utilisant l'alias, vous pourriez préférer obtenir les équipes avec impatience:

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

Ce faisant, vous assurez-vous de ne pas toucher à nouveau la base de données lors de l'accès à la collection Teams de Member.

+0

Merci ... Après avoir réfléchi pendant des heures, j'ai eu la même réponse :) –

Questions connexes