nHibernate使用Criteria API进行多对多查询

时间:2010-02-15 19:20:13

标签: nhibernate fluent-nhibernate many-to-many criteria

在询问之前,我已查看过有关此主题的所有相关帖子

我还阅读了这篇博文: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。我的地图接缝很好,我可以保存对象就好了!

1 个答案:

答案 0 :(得分:4)

通过为CreateAlias路径调用Teams,NHibernate将为您加入适当的表。不需要在成员ID上执行子查询:

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

但是,你甚至没有使用别名,所以你可能只是渴望得到团队:

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

这样做可确保您在访问每个Member的{​​{1}}集合时不会再次访问数据库。