根据集合交叉点过滤结果?

时间:2014-05-19 07:41:02

标签: c# lambda

我有一个对象(Ticket),它与另一个对象(WorkflowItem)有关联,而它又有一组权限(WorkflowItemPermissions)。我想要实现的目标(没有让自己陷入死亡)是允许调用的结果使所有票据能够根据具有特定角色/角色的用户过滤掉所有票证。所以这里有一些代码:

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”子句),但这是一个介于2个int集合之间的文件管理器。首先是这是可能的,然后,请告诉我如何。

3 个答案:

答案 0 :(得分:0)

&#39;我不确定是什么问题。这对我来说绝对正确:

        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

答案 1 :(得分:0)

试试这个:

tickets.Where(ti => ti.Workflow.Permissions.Any(p => permissions.Contains(p.RoleID)))

其中

var permissions = new List<int>{1,2,3,4,5}

和&#39;门票&#39;是IEnumerable<Ticket>,包含所有门票

答案 2 :(得分:0)

试试这个

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