以下SQL语句的nhibernate(版本3.3)查询(标准?)中的语法是什么:
SELECT DISTINCT usr.* FROM User usr, User_SecurityGroup grp, SecurityGroup_Permission prm, Permission org
WHERE usr.Id = grp.User_id AND grp.SecurityGroup_id = prm.SecurityGroup_id AND org.Id = prm.Permission_id
AND org.Site_id IN (1,2,3) AND org.PermRead = 1 AND usr.Active = 1 AND org.Active = 1;
我不确定如何在表和条件语法之间完成联接以完成此任务。
对于此特定查询,将在
中传递站点ID列表条件“org.PermRead = 1”,属性名称将是动态的。所以它可能是“PermWrite”。
编辑: 好的,这就是我到目前为止所拥有的
ICriteria criteria = this.Session.CreateCriteria<User>();
criteria.Add(Restrictions.In("User.Site", siteList.ToArray()));
criteria.Add(Restrictions.Eq("User.Active", true));
criteria.Add(Restrictions.Eq("Site.Active", true));
criteria.Add(Restrictions.Eq(Enum.GetName(typeof(Perm.Types), access), true));
criteria.SetResultTransformer(Transformers.DistinctRootEntity);
return criteria.List<User>();
我认为联接的格式如下:
criteria.CreateAlias("Sites", "Sites", NHibernate.SqlCommand.JoinType.LeftOuterJoin);
答案 0 :(得分:0)
ICriteria criteria = Session.CreateCriteria<User>()
.Add(Restrictions.Eq("Active", true))
.CreateCriteria("Sites", "Site");
.Add(Restrictions.In("Id", siteList.ToArray()))
.Add(Restrictions.Eq("Active", true))
.Add(Restrictions.Eq(access.ToString(), true))
return criteria.List<User>();
答案 1 :(得分:0)
我最终得到了这个:
ICriteria criteria = Session.CreateCriteria<User>()
.CreateAlias("SecurityGroups", "SecurityGroups")
.CreateAlias("SecurityGroups.Permissions", "Permissions")
.Add(Restrictions.Eq("Permissions.Active", true))
.Add(Restrictions.Eq("Active", true))
.Add(Restrictions.In("Permissions.Site", ids.ToArray()))
.Add(Restrictions.Eq("Permissions.Perm" + Enum.GetName(typeof(Perm.Types), accessRight), Perm.Level.Allow));
return criteria.List<User>();