首页 > 解决方案 > 检查孙子记录以返回祖父母。林克

问题描述

我有不同的角色,每个用户可以有多个角色。每个角色都以不同的方式与客户记录相关联,例如,业务分析师与项目有多对多的关系,每个客户有多个项目;而一个客户记录只能有一个与之关联的项目经理。

public class Customer
{
    public CustomerProjectManager ProjectManager { get; set; }
    public ICollection<Project> Projects{ get; set; }
    ...
}

public class Project 
{
    public ICollection<ProjectBusinessAnalyst> BusinessAnalysts { get; set; }
    public ICollection<ProjectDeveloper> ProjectDevelopers { get; set; }
    ...
}

public class ProjectDeveloper
{
    public int Id { get; set; }
    public Project Project{ get; set; }
    public int ProjectId { get; set; }
    public string DeveloperId { get; set; }
    public string DeveloperEmail { get; set; }
    public string DeveloperName { get; set; }
}

public class CustomerProjectManager
{
     public int Id { get; set; }
     public ICollection<Customer> Customers { get; set; }
     public string ProjectManagerId { get; set; }
     public string ProjectManagerEmail { get; set; }
     public string ProjectManagerName { get; set; }

     public CustomerProjectManager()
     {
         Customers = new List<Customer>();
     }
}

我需要根据角色获取客户记录。为了进一步解释,我需要组合根据分配给单个用户的不同角色获取的多个客户列表。我无法形成正确的 linq 查询。

我有一个示例查询,如下所述,它有时会返回正确的记录,但如果我有一个新用户并且没有客户分配给该用户,则该查询将返回所有现有客户。对我来说重要的是所有组合和过滤都在 Iqueryable 中完成

请帮忙!

public async Task<List<Customer>> FetchCustomers(string userId, List<string> userRoles, string userEmail)
{
    if (userRoles.Contains("Admin"))
    {
         customer = _context.Customers;
    }
    else if (userRoles.Contains("Project Manager") ||
             userRoles.Contains("Business Analyst") ||
             userRoles.Contains("Developer"))
    {
         if (userRoles.Contains("Project Manager"))
         {
             customers = customers.Where(c => c.ProjectManager.ProjectManagerId == userId
                       || c.Projects.Any(op =>                                              
                          op.ProjectsCompleted.Any(assignee =>                                                           
                          assignee.UserId == userId)));
         }
         if (userRoles.Contains("Business Analyst"))
         {
             var allPossibleCustomers = _context.Customers.Where(c =>
                            c.Projects.Any(op => op.BusinessAnalysts.Any(ba => ba.BusinessAnalystId == userId)));

             customers = customers?.Union(allPossibleCustomers) ?? allPossibleCustomers;
         }
         if (userRoles.Contains(Roles.Developer.GetDescription()))
         {
              var allPossibleCustomers = _context.Customers.Where(c =>
              c.Projects.Any(op => op.PREDevDevelopersAssigned.Any(ba => ba.DeveloperId == userId)));
                    
             customers = customers?.Union(allPossibleCustomers) ?? allPossibleCustomers;
         }
    }
    var listData = await PagingList<Customer>.CreatePageAsync(customers, page, limit);
    return listData;
}

标签: linq.net-coreiqueryable

解决方案


显然我试图返回错误的列表。linq 查询是正确的。


推荐阅读