linq - 检查孙子记录以返回祖父母。林克
问题描述
我有不同的角色,每个用户可以有多个角色。每个角色都以不同的方式与客户记录相关联,例如,业务分析师与项目有多对多的关系,每个客户有多个项目;而一个客户记录只能有一个与之关联的项目经理。
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 查询是正确的。
推荐阅读
- node.js - Node.js 和 MongoDB 没有正确读取变量
- django - 涉及不查询几何本身的具有几何的表的查询是否比没有几何的表需要更长的查询时间?
- html - FullCalendar 标题显示 MM/YYYY 堆叠而不是并排显示
- python - RaspberryPi:TypeError:不支持的格式字符串传递给 NoneType.__format__ dht22 lcd 16x2
- oracle - Sql*Plus 错误:ORA-12154 将 sql*plus 与 oracle 12.2.0.1 Docker 映像连接
- node.js - Mongoose .findByIdAndDelete 返回 null
- java - 代码创建了比需要更多的 swing Timer 实例
- google-sheets - 条形图未在 Google 表格中同时显示 $ 和 % 列
- javascript - Firebase 函数部署引发打字稿错误
- python - 在磁盘上存储多维张量并从偏移量读取