基于集合交集的过滤结果
本文关键字:过滤 结果 于集合 集合 | 更新日期: 2023-09-27 18:04:04
我有一个对象(Ticket),它与另一个对象(WorkflowItem)有关联,并且它又有一个权限集合(WorkflowItemPermissions)。我想要实现的是(在不让自己陷入for循环的情况下),允许调用获得所有票证的结果能够根据具有特定角色/角色的用户过滤掉所有票证。下面是一些代码:
public class Ticket{
public WorkflowItem Workflow;
}
public class WorkflowItem{
public List<WorkflowItemPermission> Permissions;
}
public class WorkflowItemPermission{
public int RoleID;
}
好,这就是基本的对象图(请原谅任何编译错误,这只是为了举例)。我想要实现的是这样的呼叫
service.All(new List<int>{1,2,3,4,5});
从上面的代码片段,你可以看到,我想拿回所有门票,其中WorkflowPermission。RoleID在传递给方法调用的角色列表中。这就是我到目前为止所拥有的,但它既不工作也不编译(好像那些是互斥的LOL)。
public List<Ticket> All(List<int> Roles)
{
List<Ticket> tickets = _repository.All().Where(c=> Roles.Intersect(c.WorkflowItem.Permissions.Select(a => a.RoleID))).ToList();
return tickets;
}
现在通常你会使用一个简单的包含或类似的过滤器(基本上是一个"in"子句),但这是两个整数集合之间的过滤器。首先,这可能吗?其次,请告诉我怎么做。
试试这个
public List<Ticket> All(List<int> Roles)
{
List<Ticket> tickets = _repository.All().Where(x => x.Workflow.Permissions.Any(y => Roles.Contains(y.RoleID))).ToList<Ticket>();
return tickets;
}
我不太确定是什么问题。这对我来说绝对正确:
var a = new List<int> { 1, 2, 3 };
var b = new List<int> { 3, 4, 5 };
var c = a.Intersect(b).ToList();
Console.WriteLine(string.Join(",",c.Select(c1 => c1+"").ToArray()));
Console.ReadKey();
返回:3
试试这个:
tickets.Where(ti => ti.Workflow.Permissions.Any(p => permissions.Contains(p.RoleID)))
,
var permissions = new List<int>{1,2,3,4,5}
和'tickets'是包含所有门票的IEnumerable<Ticket>