Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NHibernate使用QueryOver和Future左键连接两个集合_C#_Sql_Sql Server_Nhibernate_Queryover_Linq To Nhibernate - Fatal编程技术网

C# NHibernate使用QueryOver和Future左键连接两个集合

C# NHibernate使用QueryOver和Future左键连接两个集合,c#,sql,sql-server,nhibernate,queryover,linq-to-nhibernate,C#,Sql,Sql Server,Nhibernate,Queryover,Linq To Nhibernate,我有项目实体、项目角色和项目用户实体: public class Project { ... public virtual IList<ProjectRole> Roles { get; set; } public virtual IList<ProjectUser> ProjectUsers { get; set; } } public class ProjectRole { public int ProjectID { get; se

我有项目实体、项目角色和项目用户实体:

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; }
}

我错过了什么?我应该如何在同一个实体
项目
上链接两个查询?

您是否尝试在内存中完成这项工作?就你的情况而言,我认为这是明智的

using System.Linq;

// ...

var projects = projectsForUserRoles.Union(projectsForUser).ToList();
这就是Najera所建议的,但是不需要关心覆盖
GetHascode
Equals
仅针对这种情况:一级缓存将确保您将获得相同实体的相同引用

现在,我觉得奇怪的是,当你只是在过滤它们时,“不止一个包”的限制开始生效。但是消息告诉您正在抓取。我知道的不多,所以帮不上你把它改为只过滤,不抓取

相反,我会写:

using System.Linq;
using NHibernate.Linq;

// ...

var projects = s.Query<Project>()
    .Where(p => p.DeletedDate == null)
    .Where(
        p => p.ProjectUsers.Any(pu => pu.UserID == loggedUserID) ||
            p.Roles.Any(pr => userRoles.Contains(pr.RoleID)))
    .ToList();
使用System.Linq;
使用NHibernate.Linq;
// ...
var projects=s.Query()
.Where(p=>p.DeletedDate==null)
.在哪里(
p=>p.ProjectUsers.Any(pu=>pu.UserID==loggedUserID)||
p、 Roles.Any(pr=>userRoles.Contains(pr.RoleID)))
.ToList();

您是否尝试过
projectsfourser.Union(projectsfourserroles.ToList()
重写哈希代码和equals方法?
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
)
using System.Linq;

// ...

var projects = projectsForUserRoles.Union(projectsForUser).ToList();
using System.Linq;
using NHibernate.Linq;

// ...

var projects = s.Query<Project>()
    .Where(p => p.DeletedDate == null)
    .Where(
        p => p.ProjectUsers.Any(pu => pu.UserID == loggedUserID) ||
            p.Roles.Any(pr => userRoles.Contains(pr.RoleID)))
    .ToList();