2010-02-15 9 views
5

Bevor Sie das ich auf allen relevanten Beiträge zu diesem Thema ausgesehen habennHibernate Many-to-Many-Abfrage mit Kriterien API

ich auch dieses Blog-Post gelesen haben: http://ayende.com/Blog/archive/2007/12/23/NHiberante-Querying-Many-To-Many-associations-using-the-Criteria-API.aspx

Ich habe Teams und ich Mitglieder haben, gibt es viele-zu-viele-Beziehung zwischen ihnen

Grundsätzlich gilt: Mitglied -> MemberTeam < - Team

Mit meiner Abfrage ich versuche, alle Mitglieder zu erhalten, die als abgefragten Mitglied zu demselben Team gehören (einschließlich abgefragt Mitglied)

Ich habe meine Tabellen Die folgenden FluentHibernate erstellt:

TeamMap Code:

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

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

Membermap Code:

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

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

Der Code, den ich mit meiner Anfrage zu tun ist:

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

Ich weiß, dass ich etwas falsch mache, aber ich kann nicht verstehen, was es seine

Jede Hilfe Sie würde geschätzt

vielen Dank!

P.S. Meine Karte scheint gut zu sein, ich kann Objekte gut speichern!

Antwort

4

Mit dem Aufruf CreateAlias für den Pfad Teams wird NHibernate die entsprechenden Tabellen für Sie verbinden. Es gibt keine Notwendigkeit, die Unterabfrage auf Mitglied-IDs zu tun:

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

Allerdings sind Sie nicht einmal den Alias ​​verwenden, so dass Sie nur eifrig könnten es vorziehen, um die Teams zu erhalten:

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

Dabei werden Stellen Sie sicher, dass Sie nicht erneut auf die Datenbank zugreifen, wenn Sie auf die Teams Sammlung zugreifen.

+0

Danke ... Nachdem ich stundenlang nachgedacht hatte, bekam ich die gleiche Antwort :) –

Verwandte Themen