【发布时间】:2017-12-04 09:57:10
【问题描述】:
我有 Project 实体以及 ProjectRole 和 ProjectUser 实体:
public class Project {
...
public virtual IList<ProjectRole> Roles { get; set; }
public virtual IList<ProjectUser> ProjectUsers { get; set; }
}
public class ProjectRole {
public int ProjectID { get; set; }
public int RoleID { get; set; }
}
public class ProjectUser {
public int ProjectID { get; set; }
public int UserID { get; set; }
}
可以通过他的 RoleID 或专门通过他的 UserID 将用户分配给 Project。
我希望获得满足以下两个要求之一的所有项目: 用户属于分配给项目的角色(角色集合)或用户直接分配给项目(ProjectUsers)
我发现我不能做两个左连接,因为“不能获取多个包”:
ProjectRole prAlias = null;
ProjectUser puAlias = null;
var projects = s.QueryOver<Project>()
.Left.JoinAlias(p => p.Roles, () => prAlias)
.Left.JoinAlias(p => p.ProjectUsers, () => puAlias)
.Where(p => p.DeletedDate == null)
.And(() => puAlias.UserID == loggedUserID)
Restrictions.Or(
Restrictions.On(() => prAlias.RoleID).IsIn(userRoles),
Restrictions.Where(() => puAlias.UserID == loggedUserID)
);
我尝试使用两个单独的查询和未来来做到这一点:
var projectsForUserRoles = s.QueryOver<Project>()
.Left.JoinAlias(p => p.Roles, () => prAlias)
.Where(p => p.DeletedDate == null)
.And(() => prAlias.RoleID).IsIn(userRoles))
.Future();
var projectsForUser = s.QueryOver<Project>()
.Left.JoinAlias(p => p.ProjectUsers, () => puAlias)
.Where(p => p.DeletedDate == null)
.And(() => puAlias.UserID == loggedUserID)
.Future();
var projects = projectsForUserRoles.ToList();
但通过这种方式,我只能从 projectsForUserRoles 查询中获得结果,而不是 projectsForUser。两个查询分别工作正常 - 第一个返回 3 条记录,第二个返回 2 条记录。我想得到的是那些(5条记录)结果不同的总和:
SELECT DISTINCT p.ProjectID, p.ProjectName FROM
Projects p
LEFT JOIN ProjectRoles pr ON pr.ProjectID = p.ProjectID
LEFT JOIN ProjectUsers pu ON pu.ProjectID = p.ProjectID
WHERE p.DeletedDate IS NULL
AND(
pr.RoleID IN (SELECT ur.RoleID FROM UserRoles ur WHERE ur.UserID = 1)
OR pu.UserID = 1
)
我错过了什么?我应该如何将两个查询链接到同一实体Project?
【问题讨论】:
-
你试过
projectsForUser.Union(projectsForUserRoles).ToList()覆盖哈希码和equals方法吗?
标签: c# sql sql-server nhibernate