C# nhibernate标准的sql语句

C# nhibernate标准的sql语句,c#,sql,nhibernate,C#,Sql,Nhibernate,以下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_i

以下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>();
ICriteria criteria=Session.CreateCriteria()
.Add(Restrictions.Eq(“活动”,真))
.CreateCriteria(“现场”、“现场”);
.Add(Restrictions.In(“Id”,siteList.ToArray()))
.Add(Restrictions.Eq(“活动”,真))
.Add(Restrictions.Eq(access.ToString(),true))
返回条件。List();
我的结局是:

       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>();
ICriteria criteria=Session.CreateCriteria()
.CreateAlias(“SecurityGroups”、“SecurityGroups”)
.CreateAlias(“SecurityGroups.Permissions”、“Permissions”)
.Add(Restrictions.Eq(“Permissions.Active”,true))
.Add(Restrictions.Eq(“活动”,真))
.Add(Restrictions.In(“Permissions.Site”,ids.ToArray()))
.Add(Restrictions.Eq(“Permissions.Perm”+Enum.GetName(typeof(Perm.Types)、accessRight)、Perm.Level.Allow));
返回条件。List();

有几种方法可以加入所有NHibernate查询方法。您尝试了什么吗?更新了原始问题。是的,CreateAlias()(和CreateCriteria())在ICriteria上,将沿映射关联创建联接。但是,您显示的条件代码中的命名与SQL不太匹配,因此很难判断是否有任何错误。请注意,如果您尝试在没有映射关联的实体之间进行联接,则在HQL或LINQ中会容易得多。我非常确定命名不正确,因此我需要指导。如何使用createalias进行多对多映射?模型上的字段名是否用于createalias中的第一个参数?不确定映射关联是什么意思,但所有指定引用/具有多个关系的模型都有流畅的映射。您读过第15.4节()NHibernate引用的名称?它有一些简单的示例。是的,CreateAlias()的第一个参数是标准根所在实体上映射的属性或字段的名称(或使用“alias.proeperty”)。关联是使用例如References()和HasMany()映射的关联在FluentNH语法中,我的意思是字符串似乎并不都等同于SQL-例如,SQL中没有明显的“站点”概念,所以我不知道它对应什么。
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>();
       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>();