запрос nHibernate Many-Many с помощью Критериев API

Прежде, чем спросить я посмотрел на все соответствующие сообщения по этой теме

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

У меня есть Команды, и у меня есть участники, существуют many-many отношения между ними

В основном: участник-> MemberTeam <-Команда

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

Я создал свое использование таблиц После 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 list = criteria.List();

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

Любая справка ценилась бы

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

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

5
задан Daniil Harik 15 February 2010 в 19:20
поделиться

1 ответ

Благодаря вызову 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>();

Это гарантирует, что вы больше не попадете в базу данных при доступе к каждой коллекции Участника Команды .

4
ответ дан 15 December 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: