2012-11-20 96 views
0

什么是在NHibernate的语法(3.3版本)查询(标准?)以下SQL语句:sql语句NHibernate的标准

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); 
+2

有几种方法可以加入所有的NHibe rnate查询方法。你尝试过什么吗? –

+0

更新了原来的问题。 – user1838662

+0

是的,ICriteria上的CreateAlias()和CreateCriteria()会沿着映射的关联创建连接,但是你显示的条件代码中的命名与SQL并不完全匹配,所以判断是否有错误有点难。如果您试图在没有映射关联的实体之间进行连接,那么在HQL或LINQ中将更容易。 –

回答

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