Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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
Asp.net mvc 如何使用linq从多个表中获取记录_Asp.net Mvc_Entity Framework_Linq_Join - Fatal编程技术网

Asp.net mvc 如何使用linq从多个表中获取记录

Asp.net mvc 如何使用linq从多个表中获取记录,asp.net-mvc,entity-framework,linq,join,Asp.net Mvc,Entity Framework,Linq,Join,我有5个表格工作流为'A',工作流步骤为'B',AppUser为'C',AppRoles为'D',AppDepartment为'E',我希望以 1) 基于workflowId匹配A和B中的记录 2) 匹配来自B和C、B和D、B和E的记录,因为表B具有外键UserId、RoleId和DepartmentId 但问题是B中的某些列UserId为null,某些列的DepartmentId为null,而另一些列的RoleId为null,因此内部联接将不起作用 这是我的查询,它必须获取三行,但我得到的是0

我有5个表格工作流为'A',工作流步骤为'B',AppUser为'C',AppRoles为'D',AppDepartment为'E',我希望以

1) 基于workflowId匹配A和B中的记录

2) 匹配来自B和C、B和D、B和E的记录,因为表B具有外键UserId、RoleId和DepartmentId

但问题是B中的某些列UserId为null,某些列的DepartmentId为null,而另一些列的RoleId为null,因此内部联接将不起作用

这是我的查询,它必须获取三行,但我得到的是0

var workflows = (from q in _context.WorkFlowSteps
                         join p in _context.WorkFlow
                         on q.WorkFlowId equals p.WorkFlowId
                         join r in _context.AppUsers
                         on q.ApprovalUserId equals r.UserId
                         from dep in _context.AppDepartment
                         from role in _context.AppRoles
                         where (q.DepartmentId == dep.DepartmentId) &&
                               (q.RoleId == role.RoleId)&& 
                               (q.WorkFlowId == id && 
                                q.IsAllowed == true && 
                                p.WebSiteId == WebsiteId)
                         select new WorkFlowViewModel
                         {
                             UserId =Convert.ToInt32(q.ApprovalUserId.HasValue?
                                      q.ApprovalUserId:
                                      (q.DepartmentId.HasValue? 
                                       q.DepartmentId:
                                       q.RoleId)),
                             ModeId = p.ModeId,
                             WebSiteId = p.WebSiteId,
                             Step = q.StepNo,
                             Name =q.ApprovalUserId.HasValue ? 
                                   p.Name :
                                   (q.DepartmentId.HasValue? 
                                    dep.Name :
                                    r.Name),
                             WorkFlowId = p.WorkFlowId
                         }).ToList();
假设WorkFlowViewModel、WorkFlow、WorkFlowSteps、AppUsers、AppDepartment等类(最低)如此(根据Linq查询暗示):


但问题在于,B UserId中的某些列为null,某些列的DepartmentId为null,而某些列的RoleId为null,因此内部连接将不起作用
do
left join
,这是@HemidAbbasov的建议。您可以使用左连接进行此操作。访问此页面了解更多信息:。您应该很少加入LINQ to EF。相反,只需遵循导航属性即可。您的EF模型知道如何为您加入表。
public class WorkFlow
{
    public int WorkflowId { get; set; }
    public virtual IQueryable<WorkFlowSteps> WorkFlowSteps { get; set; }
    public int WebSiteId { get; set; }
    public int ModeId { get; set; }
}
public class WorkFlowSteps
{
    public int Id { get; set; }
    public int StepNo { get; set; }
    public bool IsAllowed { get; set; }
    public int WorkFlowId { get; set; }
    public WorkFlow WorkFlow { get; set; }
    public int? AppUserId { get; set; }
    public virtual AppUser AppUser { get; set; }
    public int? DepartmentId { get; set; }
    public virtual AppDepartment AppDepartment { get; set; }
    public int? RoleId { get; set; }
    public virtual AppRole AppRole { get; set; }
}
public class AppUser
{
    public int Id { get; set; }
    public List<WorkFlowSteps> WorkFlowSteps { get; set; }
    public string Name { get; set; }
}
public class AppDepartment
{
    public int Id { get; set; }
    public List<WorkFlowSteps> WorkFlowSteps { get; set; }
    public string Name { get; set; }
}
public class AppRole
{
    public int Id { get; set; }
    public List<WorkFlowSteps> WorkFlowSteps { get; set; }
    public string Name { get; set; }
}
public class WorkFlowViewModel
{
    public int WorkFlowId { get; set; }
    public int Step { get; set; }
    public int ModeId { get; set; }
    public int WebSiteId { get; set; }
    public int ApproverId { get; set; }
    public string ApproverName { get; set; }
}
// Inputs consist of workflow id & website id & EF context
var selectedRecords = _context.WorkFlows
    .Include("WorkFlowSteps")
    .Include("WorkFlowSteps.AppUser")
    .Include("WorkFlowSteps.AppDepartment")
    .Include("WorkFlowSteps.AppRole")
    .Select(r => r.Id == id && r.WebSiteId == websiteId && r.WorkFlowSteps.IsAllowed);

var myModel = (from q in selectedRecords
               select new WorkFlowViewModel
               {
                   ApproverId = Convert.ToInt32(q.WorkFlowStep.AppUserId.HasValue 
                        ? q.WorkFlowStep.AppUserId 
                        : (q.WorkFlowStep.AppDepartmentId.HasValue 
                            ? q.WorkFlowStep.AppDepartmentId 
                            : (q.WorkFlowStep.AppRoleId.HasValue ? q.WorkFlowStep.AppRoleId, "0"))),
                   ModeId = q.ModeId,
                   WebSiteId = q.WebSiteId,
                   Step = q.WorkFlowStep.StepNo,
                   ApproverName = q.WorkFlowStep.AppUserId.HasValue 
                        ? q.WorkFlowStep.AppUser.Name 
                        : (q.WorkFlowStep.AppDepartmentId.HasValue
                            ? q.WorkFlowStep.AppDepartment.Name 
                            : (q.WorkFlowStep.AppRoleId.HasValue ? q.WorkFlowStep.AppRole.Name, "")),
                   WorkFlowId = q.WorkFlowId
               }).ToList();