2010-02-15 1 views
5

Прежде чем спрашивать, я смотрел на все соответствующие посты по этой темеNHibernate многие-ко-многим запрос с использованием Criteria API

Я также прочитал этот блог: http://ayende.com/Blog/archive/2007/12/23/NHiberante-Querying-Many-To-Many-associations-using-the-Criteria-API.aspx

У меня есть команды и у меня есть члены, есть много-ко-многим между ними

в основном: Член -> MemberTeam < - Team

с моим запросом я стараюсь, чтобы получить все элементы, которые принадлежат к одной команде запрошены членом (включая запрашиваемых члена)

Я создал свои таблицы, используя следующие FluentHibernate:

TeamMap код:

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

код я делаю запрос с является:

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

Я знаю, что я делаю что-то неправильно, но я не могу понять, что это его

Любая помощь будет оценена

Большое спасибо!

P.S. Мои швы карт будут в порядке, я могу сохранить объекты просто отлично!

ответ

4

В результате звонка CreateAlias для пути Teams NHibernate присоединится к соответствующим таблицам для вас. Там нет необходимости делать подзапрос на идентификаторы членов:

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

Однако, вы даже не используя псевдоним, так что вы можете просто предпочитают охотно получить команды:

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

Это позволит убедитесь, что вы не попали в базу данных снова при обращении к каждой коллекции MemberTeams.

+0

Спасибо ... Поразмыслив часами, я получил тот же ответ :) –